twitterでも利用されているメッセージキュー Kestrelを試す
ついったーさんやってますか?
ついったーさんのバックエンドは、実はscalaで書かれているってご存じですか?
急成長するついったーさんのバックエンドを支えるなんてすごいですねscala!
ついったーさんとscalaのお話は、こちらを参考に。
Twitter on Scala
で、Kestrelというメッセージキューが、ついったーさんのバックエンドの一部で利用*1されています。
この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.
Kestrelのダウンロード、ビルド
Kestrelはjava6(JMXサポート)とAnt1.7以上が必要なのでインストールしておきましょう。
まずは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