2016-10-17 8 views
0

私はCassandraでURL短縮サービスを実装する方法を理解しようとしています。私は:CassandraでURL短縮を実装する

  • 3 Cassandraのノード(ドッカーに)たとえばbase62番号(文字列)

にbase10をコード

  • 機能:これに

    1 => a, 2 => b, 1205 => JR 
    

    問題私はを常にユニークな(インクリメントされた番号)を与えて、次の関数呼び出しが私に一意の文字列を返すようにする必要があるということです。

    CREATE TABLE urls (
        id int PRIMARY KEY, // 1215 (auto increment) 
        short_key text, // calculated short string from 1215 
        url text, // real url 
        created_at timestamp 
    ) WITH CLUSTERING ORDER BY (created_at DESC); 
    

    DESC clusteringでは、いつでも行の最後のIDを取得できます。これは、いくつかの問題を作成します。すべての前の行を読む

    1. は、あなたが書き込みの多くを持っている場合は、すべての のサーバーが遅い

    どうでしょうで次の番号を、知っている必要があります

  • を書きますあなたはこの問題を解決しますか?私は解決策を見つけようとしましたが、すべてのソリューションでボトルネックが見つかりました。また、ハッシングはオプションではありません。

  • +0

    あなたは、この非常に目的のために構築されている「カウンター」を使用してみましたか? – Sreekar

    +0

    https://docs.datastax.com/en/cql/3.1/cql/cql_using/use_counter_t.html – Sreekar

    +0

    @ xmas79に記載されているように、カウンタ値を同時に更新して読み取ることはできません。 –

    答えて

    0

    私はあなたのためにOKであるパフォーマンスわからないんだけど、私はカサンドラに基づいて、以下のソリューションを提案することができます:

    あなたはユーザサーバごとに別々のカウンタを維持することができます。各サーバーには1から62までの一意のIDが割り当てられます(62台のサーバーで十分です)。 idは、server configのどこかに格納されています。

    サーバーを起動すると、新しいIDが要求されるたびにカウンタ値が自身のIDで読み込まれ、メモリ内でインクリメントされます。また、カサンドラのカウンターを増やす必要があります。例外なくCassandraへの更新が渡された場合、その値はURL生成に使用できます。 (カサンドラを更新する際にも、少なくともクォーラム整合性レベルを使用します。)

    URL生成のためにあなたが ドメイン+「/」+ base62(SERVERID)+ base62(対価)

    での連結の種類を使用する必要がありますこの場合、あなたはあなたのURLをもう少し長く(1文字分)持ちますが、問題は解決しました。

    ここでは、トランザクション間で各サーバーのメモリにカウンタ状態を保持できると仮定します。また、1つのサーバーのスコープ内でカウンタを並行して更新しないでください。

    (一般的にはあなたも、テーブルのカウンタタイプを使用する必要はありません。また、簡単なもので動作します。)

    +0

    これは、多くのものをクリアします、ありがとう! –

    +0

    BTW最適化も可能です。各サーバー上で、10個の数字の前にカッサンドラカウンターを更新することができます。 UPDATE uniquecnt SET cnt = cnt + 10 WHERE serverid = 55; これらの10個の数字をURLに使用すると、操作を繰り返します。これにより、カサンドラへの書き込みが10倍少なくなります。しかし、この場合、あなたは、カッサンドラのどこか別の場所にユーザーに与えたURLをすべて別々に記録する必要があります。サーバーがクラッシュした場合は、ユーザーに与えたものをすべてスキップする必要があります。これは実装がもう少し複雑ですが、実行可能です。 –

    0

    分散カウンタを処理しようとしています。あなたが見つけたように、彼らは難しいですし、countersのバージョンを使っても、C *はその問題を解決しません。を同時に更新することはできません。

    私はエキスパートではありませんが、RabbitMQActiveMQKafkaのようないくつかのキューイングシステムを見てみることをお勧めします。

    +0

    よかった、ありがとう。 –