ホームページ >バックエンド開発 >Golang >Snowflake ID ジェネレーターの実装

Snowflake ID ジェネレーターの実装

Susan Sarandon
Susan Sarandonオリジナル
2024-09-21 16:18:02375ブラウズ

Implementing Snowflake Id generator

スノーフレークIDとは何ですか?

Snowflake ID は、分散環境で衝突のない、短い一意の ID を生成するために使用されます。データベースに依存した ID 生成や長い 128 ビット UUID の使用などの従来の方法とは異なり、Snowflake ID は時間と単純なビット単位の操作を使用します。この賢い手法により、衝突を避けるために中央システムを必要とせずに、各マイクロサービスが個別に一意の ID を生成できるようになります。

生成方法

Snowflake ID の生成は、3 つの主要なピースでパズルを構築するようなものです。細かく見てみましょう:

  1. n ビット長のビット文字列を取得します:

    まず、長さ n のビット文字列から始めます。これには、一意の ID を生成するために必要なすべての情報が保持されます。

  2. 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 が一意に保たれます。

  1. ピースを組み合わせます: i、j、k の値を取得したら、それらを連結して単一のビット文字列を形成します。次に、このビット文字列を基数 10 に変換して、最終的な Snowflake ID を取得します。

簡単な例え

Snowflake ID を、忙しいキッチンの特別な食器タグとして考えてください。

  • 時間 (i): これはキッチンで時を刻む時計のようなもので、後で準備された料理が先に作られた料理よりも大きな数字になるようにします。
  • マシン ID (j): 各シェフ (またはマイクロサービス) には独自の署名があり、料理タグが他のものと衝突しないようにします。
  • シーケンス番号 (k): シェフが一度に複数の料理を作る場合、タグに少しずつ追加するため、各料理には固有のラベルが付けられます。

Go で実装されたスノーフレーク

Snowflake ID 生成の Go 実装については、この GitHub リポジトリを確認してください

情報源

  1. https://blog.x.com/engineering/en_us/a/2010/payment-snowflake
  2. https://en.wikipedia.org/wiki/Snowflake_ID

以上がSnowflake ID ジェネレーターの実装の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。