この記事はOSS紹介 Advent Calendar 2017の6日目の記事です。OSS紹介 Advent Calendar 2017では、使っている便利なOSSを紹介したい方や、自分のOSSを広めたいという方の投稿をお待ちしております。
本日は、Unique ID生成器が流行っているので現在使っているOSSである、katsubushiを紹介します。
特徴
- ビットごとに時間,
worker-id
,sequence
が割り振られたsnowflake系のID生成器です - 以下は上位からのビットの中身です
ビット範囲 | 中身 |
---|---|
42ビット |
2015-01-01 00:00:00 からの積算ミリ秒 |
10ビット | worker-id |
12ビット | sequence |
ID生成器の実装に関してはこちらを参照するとよいでしょう。
- katsubushiは他のプログラムから独立したデーモンとして動作します
- memcachedプロトコル(テキストプロトコル)で動作します
- クライアントライブラリが豊富です
- HTTPよりもオーバーヘッドが少ないです
使い方
インストール
releaseバイナリがあるので、そこからダウンロードするのが良いでしょう。
ghgを利用するとプラットフォームにあったバイナリを簡単にダウンロードすることが出来ます。
$ ghg get kayac/go-katsubushi
起動するには、-worker-id
を指定します。-worker-id
は複数のkatsubushi同士が発行するIDが被らないように設定する識別子です。範囲は0-1023までです。
$ katsubushi -worker-id=1
v1.2.0
からはredisを使ったworker-id
の自動発番も利用することが出来ます。
$ katsubushi -redis='redis://localhost:6379/1?ns=katsubushi'
デフォルトでは11212
番ポートで立ち上がります。
発番
前述したように、memcachedプロトコルを用いているので、簡単に発番することが出来ます。複数個のIDを一気に発行することも出来ます。
$ telnet localhost 11212
Trying ::1...
Connected to localhost.
Escape character is '^]'.
GET a
VALUE a 0 18
387779837193895936
END
GET a b c
VALUE a 0 18
387779862779150336
VALUE b 0 18
387779862779150337
VALUE c 0 18
387779862779150338
END
プログラムから使うには、例えばPerlであればCache::Memcached::Fast
を使って、
use Cache::Memcached::Fast;
my $memd = Cache::Memcached::Fast->new({
servers => ["localhost:11211"],
});
$memd->get("a"); # => 387782075148681216
$memd->get_multi(1..10); # => { 1 => 387782207940345856, 2 => 387782207940345857, ... }
という風にIDを発番することが出来ます。
好きな言語を使ったアプリケーションに簡単に組み込めるため、ORMなどに組み込んで、手軽にユニークなIDに利用することが出来ます。また、複数個を一度に発行できるメリットを活かして、RDBMSへbulk insertを行う場合でも利用できます。
使用事例
-
ソーシャルゲームのカスタマーサポートを支える行動ログとredash
- ユーザ行動ログのtrace idの発番に利用しています