2017年1月22日日曜日

MayLily ver1.0.0を公開しました

去年計画だけ発表したユニークID生成プロジェクトのMayLilyをようやく公開しました。


概要

以前に書いたとおり、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ビット整数型が今後の規格に追加されることを願いましょう。

ライセンス

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

0 件のコメント:

コメントを投稿