( ꒪⌓꒪) ゆるよろ日記

( ゚∀゚)o彡°オパーイ!オパーイ! ( ;゚皿゚)ノシΣ フィンギィィーーッ!!!

twitterでも利用されているメッセージキュー Kestrelを試す

ついったーさんやってますか?
ついったーさんのバックエンドは、実はscalaで書かれているってご存じですか?


急成長するついったーさんのバックエンドを支えるなんてすごいですねscala!


ついったーさんとscalaのお話は、こちらを参考に。
Twitter on Scala


で、Kestrelというメッセージキューが、ついったーさんのバックエンドの一部で利用*1されています。


robey/kestrel · GitHub


このKestrelはオープンソースで誰でも利用することができます。
ちょっと試してみましょう。

Kestrelの特徴

READMEに書いてあるものをものっそいてきとうに意訳します。

Kestrel is:

fast
It runs on the JVM so it can take advantage of the hard work people have put into java performance.

small
Currently about 1.5K lines of scala (including comments), because it relies on Apache Mina (a rough equivalent of Danger's ziggurat or Ruby's EventMachine) and actors -- and frankly because Scala is extremely expressive.

durable
Queues are stored in memory for speed, but logged into a journal on disk so that servers can be shutdown or moved without losing any data.

reliable
A client can ask to "tentatively" fetch an item from a queue, and if that client disconnects from kestrel before confirming ownership of the item, the item is handed to another client. In this way, crashing clients don't cause lost messages.
  1. 高速なんだぜ?
    1. JVMで動くからだよ
  2. 小さいぜ?
    1. 1.5K行
    2. Apache Minaとactorで書いてるから
  3. 丈夫だぜ?
    1. キューの中身はメモリに書くけど、ファイルにジャーナリングするから
  4. 信頼していいんだぜ?
    1. クライアントがキューから取ってる最中にクラッシュしてもキューの中身は消えない
    2. トランザクションっぽい

Kestrelのダウンロード、ビルド

Kestrelはjava6(JMXサポート)とAnt1.7以上が必要なのでインストールしておきましょう。


まずはKestrelのソースをダウンロードして来ましょう。
ソースはGithubにありますよ。


robey/kestrel · GitHub


落としてきたら、ソースのディレクトリに移動して、antコマンドをうちます。
結構時間がかかります*2が、これでビルドできます。

Kestrelを起動する

ビルド出来たら、dist/kestrel-1.1.2/とかってディレクトリができてます。
kestrel-1.1.2.jarとか置いてありますね。


kestrelの起動は、dist/kestrel-1.1.2/scriptsにあるkestrel.shを叩けばいいんですが、よく見ると/usr/local/bin/daemonとか書いてあります。
自分はmac osxなので/usr/local/bin/daemonとかありません。


めんどくさいのでjava -jarコマンドで起動しました。


kestrelを動かすためには、ジャーナル書き込み用のディレクトリ( /var/log/kestrel) と、spool用のディレクトリ(/var/spool/kestrel)が必要なのであらかじめ作成しておきます。

mkdir -p /var/log/kestrel 
sudo chown -R <ユーザー名>:staff /var/log/kestrel
mkdir -p /var/spool/kestrel
sudo chown -R <ユーザー名>:staff /var/spool/kestrel

準備が終わったら、dist/kestrel-1.1.2/に移動して、java -jar kestrel-1.1.2.jar で起動します。

cd dist/kestrel-1.1.2/
java -jar kestrel-1.1.2.jar

Memcache Protocolでのset/get

kestrelは、メッセージのキューイングにMemcache Protocolを利用します。
クライアントからkestrelにコネクションを張って、Memcache Protocolに準拠したコマンドを投げることでメッセージをキューに入れたり、取り出したり出来ます。


memcachedコマンドについては、こちらを参考にしました。
[memcached] memcachedコマンド一覧 - Life with IT


kestrelはデフォルトで22133portをlistenしているので、telnetコマンドで接続してみます。

$ telnet localhost 22133 
Trying ::1...
Connected to localhost.
Escape character is '^]'.
set foo 0 0 3
aaa
STORED
set foo 0 0 4
bbbb
STORED

memcachedコマンドでset <キー> <フラグ> <有効期間> <サイズ>でデータをキューに入れます。
上の例では、キー:fooに"aaa"と"bbbb"を入れています。
kestrelでは、memcacheのキーが、キュー名に相当します。


次は、キューに入れたデータを取り出してみます。
memcachedコマンドで、get <キー> で取り出せます。

get foo
VALUE foo 0 3
aaa
END
get foo
VALUE foo 0 4
bbbb
END

キー:fooにstoreした順番に、データを取り出せることが確認出来ました。


本当は、kestrelを使ってついったのタイムラインをkestrelのキューに入れて、キューから取り出してGrowlで通知するサンプルとか書こうと思ったんですが、力尽きたのでここまでにしておきます。宗教上の理由で。


参考:
http://sites.google.com/site/scalatohoku/dai-29kai-benkyou-kai

*1:SMSのメッセージングあたりらしい

*2:13分とかかかった