LoginSignup
6
6

More than 5 years have passed since last update.

snowflake系ID生成器katsubushiのご紹介

Last updated at Posted at 2017-12-06

この記事は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は他のプログラムから独立したデーモンとして動作します
    • 言語を問わず利用できます
    • sonyflakeも同様のライブラリですが、本体はGoから使うライブラリです。exampleにHTTPサーバでIDを返す実装があります
  • 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を行う場合でも利用できます。

使用事例

参考記事

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6