概要
以前に書いたとおり、SnowflakeのNode.js版です。ウェブサービス内で使うことを想定しています。Node.jsがシングルスレッドということを利用して、シーケンスカウンタを変数に保存しています。そのため外部の保存先は不要で、他に依存モジュールもないので単体で動作します。
インストール
普通にnpm
でインストールしてください。 $ npm install --save maylily
使い方
maylily()
とコールするだけです。Promise
オブジェクトを返すので、then()
の引数でIDを受け取ってください。var maylily = require("maylily"); maylily() .then(function(id) { // idに生成されたIDが入っています }) .catch(function(err) { // Errorクラスのインスタンスです // 前回コール時より時間が巻き戻っていた場合等に例外が飛びます });ECMAScript7のasync/awaitを使うともっと簡単に書けます。
import maylily from "maylily"; try { // idに生成されたIDが入っています const id = await maylily(); } catch(err) { // Errorクラスのインスタンスです // 前回コール時より時間が巻き戻っていた場合等に例外が飛びます }
Promise
が必要なのは、シーケンスカウンタを使いきったときにタイムスタンプが変わるまで待つためです。ビジーウェイトで実装すれば
Promise
は不要ですが、手元のマシン(数年前に買ったノートPC)でも1ミリ秒の間に数十のID生成ができるので、その間ビジーウェイトするのはCPUの無駄遣い&その間に他の処理をしたほうが効率的です。カスタマイズ
MayLilyでは、各要素にどれだけのビット数を割り当てるか指定できます。maylily()
コール時にオプションを渡してください。渡せるパラメータと初期値は以下の通りです。
maylily({ timeBase: Date.parse("2000-01-01T00:00:00Z"), // 基準のUnixタイムスタンプ[ミリ秒] machineId: 0, // コンピュータID(サービス内で一意) machineBits: 2, // machineIdに使うビット数 generatorId: process.pid, // 生成器ID(コンピュータ内で一意) generatorBits: 7, // generatorIdに使うビット数 sequenceBits: 5 // シーケンスに使うビット数 });変更したパラメータは、次に変更するまで保存されます。
注意点として、JavaScriptには64ビット整数型がないので53ビットを超えると不正確な値が返ってきます。
少しでもビット数を節約するために、
machineBits
/generatorBits
/sequenceBits
をサービスに合わせて調節してください。64ビット整数型が今後の規格に追加されることを願いましょう。
0 件のコメント:
コメントを投稿