2012-03-09 8 views
1

代理キーの実装としてどちらを選択しますか?アプリケーション内でローカルに生成されローカルUUIDとネットワーク固有のカウンタID

  • ローカルUUID
    • 、それ
    • を取得するには、noネットワークトリップしかし、長さが長くなり、お使いのストレージ・サイズの使用
    • 長々URLの大きさに影響を与えることができます長いUUID
    • UUIDの衝突が起こることを最も小さい恐怖と
  • それとも...ネットワークユニーク-counte R IDの私は$ INC
  • がはるかに短いネットワークの旅の費用と原子INCまたはモンゴでリモートRedisのを想像
    • (このための適切な用語であるかについてわからないが)、あまり取りでも、クラスタ化されたアプリケーションの低並行処理アプリケーションのための

答えて

1

上のスペースとはるかに短いURL

  • 衝突の恐れが生じは、おそらくネットワークのカウンタIDを使用することができます。 しかし、URLを除いて、低い並行性(=大量のデータではない)に関心はありません。

    重度の同時アクセスの場合、多くのデータ、多くのクラスタ、エンジン+関連ネットワークの再構築がおそらくこの解決策のために遅くなるでしょう。

    結論: - ネットワークカウンタはセクシーですが役に立たないようです。私の意見では、、MongoDBです。

    MongoDBの衝突では、作成アルゴリズムのために、衝突はゼロに近いです。私はuuidの一部がマシンアドレスでビルドされていることを説明しています。これは一意でなければならず、クラスタを運用する前にこのアドレスを取得できます。

  • +0

    ありがとうございます。私はパフォーマンスも好む。 – bertie

    2

    あなたはMongoDBのを使用している場合は、BSONのObjectIDを使用してになります。

    http://www.mongodb.org/display/DOCS/Object+IDs

    あなた自身を特に指定して_idフィールドを作成しない限り、彼らは_idフィールドとしてデフォルトで作成されている(こともできますあなたが作成したばかりのObjectIDになります)。衝突の恐れがなく、アプリケーションでも使用できるDBにネイティブにサポートされているIDタイプを取得できます。 )もちろん、MongoDBを使用している限り、win-winのようです。)

    +0

    洞察力ありがとう。現在、私はアプリからUUIDを生成していて、mongoから少し負荷をかけています。 – bertie

    +0

    mongoのuuidに似た完全なUUIDを生成する場合は、Mongoが生成するようにしてください。だからあなたがシャーディングを使うとき、モンゴの世代はあなたより速いでしょう。 – AlphaB

    2

    両方の方法を組み合わせることができます。ツイッターのSnowFlakeアルゴリズムを見てみましょう。このアルゴリズムは、グローバルユニークな整数(64ビット)を生成しますが、調整なしでは、純粋なローカルアルゴルティムです。

    関連する問題