分散環境と並行環境で一意のシーケンス番号を生成するための制約とトレードオフに興味があります。
これを想像してみてください:私は、あなたが尋ねるたびに一意のシーケンス番号を返すだけのシステムを持っています。このようなシステムの理想的な仕様 (制約) は次のとおりです。
- 高負荷の下で起きていてください。
- できるだけ多くの同時接続を許可します。
- 分散: 複数のマシンに負荷を分散します。
- パフォーマンス: 可能な限り高速に実行し、可能な限り多くのスループットを実現します。
- 正確性: 生成される数値は次の条件を満たしている必要があります。
- 繰り返さない。
- リクエストごとに一意である必要があります (2 つのリクエストがまったく同時に発生した場合、関係を解消する方法が必要です)。
- (昇順) 順番に。
- リクエスト間にギャップはありません: 1,2,3,4... (事実上、合計 # リクエストのカウンター)
- 耐障害性: 1 つ以上のマシン、またはすべてのマシンがダウンした場合、障害が発生する前の状態に再開できます。
明らかに、これは理想化された仕様であり、すべての制約を完全に満たすことはできません。CAP定理を参照してください。ただし、制約のさまざまな緩和についての分析をお聞きしたいと思います。どのようなタイプの問題が残り、残りの問題を解決するためにどのアルゴリズムを使用するか。たとえば、カウンター制約を取り除くと、問題ははるかに簡単になります。ギャップが許容されるため、数値範囲を分割して、それらを異なるマシンにマップするだけです。
参考文献 (論文、書籍、コード) は大歓迎です。また、既存のソフトウェア (オープン ソースかどうか) のリストも保持したいと思います。
ソフトウェア:
- Snowflake : 一意の ID 番号を大規模に生成するためのネットワーク サービスで、いくつかの単純な保証があります。
- keyspace : ID を任意の目的に使用できる、公的にアクセス可能な一意の 128 ビット ID ジェネレーター
- RFC-4122 の実装は、多くの言語で存在します。RFC 仕様は、システム間の調整の必要性を防止するため、おそらく非常に優れたベースであり、UUID は 128 ビットであり、仕様の特定のバージョンを実装するソフトウェアから ID を使用する場合、タイム コード部分が含まれています。仕分け可能 など