kestrelを試してみたよ

メッセージキューイングシステムが必要でActiveMQとか調べてたけど、やっぱなんかめんどくさそうだし、必要以上にエンタープライズ臭がするのでkestrelを試してみました。

twitter/kestrel · GitHub

kestrelはTwitterのバッググラウンドで使われている(らしい)、メッセージキューイングシステムです。
特徴は、ゆろよろさんのブログにも和訳(githubにおいてあるREADMEの和訳)がありますが、以下の通りです。

  • 速くて、
  • 小さくて、
  • 障害に強くて、
  • 信頼できる。

今のコード量はコメント入れて2000行ほどで、たしかに小さいです。
あと、大きな特徴として、memcacheプロトコルでキューへのput/getを行います。
また、ActiveMQと比べたらライトウェイトで速そうな雰囲気です。

必要なもの

  • JDK6
  • Scala2.7.7 final
  • sbt
  • git

ダウンロードとインストール

まずはgithubからソースをダウンロードします。
http://github.com/robey/kestrel

sbtを使っているので、適当に展開して以下のコマンドでビルドします。

sbt clean update package-dist

※sbtをScala2.8.0で動かすとビルドできません

正常にビルドできると、dist/kestrel-x.x.xというディレクトリができます。(x.x.xはバージョン番号)
このディレクトリをどっかよさげなところにコピーして使います。以降$KESTREL_HOMEと呼びます。

起動してみる

起動するためには、以下の2つのディレクトリが必要なので、作成&書き込めるようにしておきます。

  • ジャーナル保存用ディレクトリ /var/spool/kestrel
  • 動作ログ用ディレクトリ /var/log/kestrel

このへんの設定は、$KESTREL_HOME/config/production.conf に書かれてます。

  3 # where to listen for connections:
  4 port = 22133
  5 host = "0.0.0.0"
  6
  7 log {
  8   filename = "/var/log/kestrel/kestrel.log"
  9   roll = "daily"
 10   level = "info"
 11 }
 12
 13 queue_path = "/var/spool/kestrel"

で、起動するためには $KESTREL_HOME/scripts/kestrel.sh というdaemonizeして動かすためのシェルスクリプトがありますが、オレオレスクリプトな感じなので無視して、以下のコマンドで普通に起動できます。

java -jar $KESTREL_HOME/kestrel-x.x.x.jar &

入れてみる

さっきの設定ファイルに書いてある通り、デフォルトではポート22133で待ち受けてます。

というわけで、telnetでつないでmemcacheプロトコルっぽくいじっています。

$ telnet localhost 22133
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
stats <= 入力
STAT uptime 15
STAT time 1287045949
STAT version 1.2.2
STAT curr_items 0
STAT total_items 0
STAT bytes 0
...
END
set keyname 0 0 1 <= 入力
a <= 入力
STORED
set keyname 0 0 1 <= 入力
b <= 入力
STORED
set keyname 0 0 1 <= 入力
c <= 入力
STORED
get keyname <= 入力
VALUE keyname 0 1
1
END
get keyname <= 入力
VALUE keyname 0 1
b
END
get keyname <= 入力
VALUE keyname 0 1
c
END

という感じで、キューとして機能します。

と、ここまで書いてみたけど、まんまyuroyoroさんのエントリと一緒だ。
引き続き、kestrelをちゃんとしたスケーラブルなMQとして使うまでがんばります。