Snowflake ID は、分散環境で衝突のない、短い一意の ID を生成するために使用されます。データベースに依存した ID 生成や長い 128 ビット UUID の使用などの従来の方法とは異なり、Snowflake ID は時間と単純なビット単位の操作を使用します。この賢い手法により、衝突を避けるために中央システムを必要とせずに、各マイクロサービスが個別に一意の ID を生成できるようになります。
Snowflake ID の生成は、3 つの主要なピースでパズルを構築するようなものです。細かく見てみましょう:
n ビット長のビット文字列を取得します:
まず、長さ n のビット文字列から始めます。これには、一意の ID を生成するために必要なすべての情報が保持されます。
i、j、k の 3 つのセクションに分割します:
ビット文字列は、i + j + k = n のように 3 つの部分に分割されます。
i - 時間コンポーネント:
最初の部分 i は現在の時刻を表します。固定の開始時間 (エポックとも呼ばれます) を選択すると、i のビットは現在の時間をナノ秒単位で取得し、開始時間を減算することによって計算されます。これにより、新しい ID が常に古い ID よりも大きくなります。
j - マシン ID:
2 番目の部分 j はマシン識別子です。マイクロサービスが開始されると、一意の ID (マシン ID) が割り当てられ、これが j 部分になります。これにより、異なるマシンによって生成された ID が、たとえまったく同じ瞬間に作成されたとしても、衝突することがなくなります。
k - シーケンス番号:
最後の部分 k はシーケンス番号です。これは、同じ時間単位内に複数の ID が生成されるたびに増加するカウンターのように機能します。これにより、ID が立て続けに生成された場合でも、ID が一意に保たれます。
Snowflake ID を、忙しいキッチンの特別な食器タグとして考えてください。
Snowflake ID 生成の Go 実装については、この GitHub リポジトリを確認してください
以上がSnowflake ID ジェネレーターの実装の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。