2016年11月27日日曜日

ユニークID生成プロジェクト "MayLily"

突然ですが、TwitterのSnowflakeのNode.js版、MayLilyプロジェクトを立ち上げました。

そういえばSnowflakeのメインブランチからコードが消滅してしまいましたね。

Snowflake

MayLilyの元になったSnowflakeも64bitのユニークIDを生成するプロジェクトです。先頭から
  • 1bit…"0"固定
  • 41bit…ミリ秒単位のタイムスタンプ(起点は1970年固定ではなく任意に設定可)
  • 10bit…ジェネレータID
  • 12bit…ジェネレータごとの連番
こんな感じの内訳です。

タイムスタンプの起点を任意に設定することで、サービス開始からほぼ70年間(241 / (1000 * 60 * 60 * 365.242189) ≈ 69.68年)はIDを生成できます。

ジェネレータIDは、生成器ごとにユニークな値を割り当て、分散処理するときに同じ時間に生成しても値が競合しないようにしています。

最後の連番は、同じ時刻に複数回コールされたときのために用意しています。
1ミリ秒の間に4096回までしかコールできませんが、それを超えてコールした場合は1ミリ秒経過するのを待ちます。
なお、タイムスタンプが更新されると0にリセットされます。

特徴

  • 分散処理 
  • 昇順=生成時刻順
  • IDから簡単な計算をするだけで生成時刻がわかる
と、大量のつぶやきを管理するTwitterらしい特徴ですね。

MayLily

MayLilyもSnowflakeのNode.js版のようなものなので、基本的な構成は同じです。
特徴は、連番を保存する場所が不要でパッケージ単体で動作するということです。

Snowflakeは前回のタイムスタンプや連番を保持するのに外部のストレージが必要ですが、Node.jsは原則としてシングルプロセス・シングルスレッドなので、内部変数に持っておけばいいんじゃね?と考えました。

ただし、PM2のように複数プロセス起動するパッケージもあるので、ジェネレータIDにプロセスID情報も含めることで対応します。

MITライセンスです。お好きに使ってください。


…というような内容でそのうち作ります。

0 件のコメント:

コメントを投稿