イベント駆動のSinatra風Rubyフレームワーク「Cool.io」
Node.jsが使っているのと同じイベントループ・ライブラリ「libev」を活用し、Sinatra風のDSLが使えるRuby向けフレームワーク「Cool.io」のバージョン1.0が12月14日に登場しました(GitHubのレポジトリ)。
Cool.ioの開発自体は2007年12月に始まったRevという前身プロジェクトまでさかのぼります。途中で名称変更をしたんですね。「Cool I/O」ということでI/Oバウンドなサーバ処理に「いい感じ」という風にも取れますし、Coolioというアメリカ人のラッパーの名前にも通じていて、ちょっとRubyっぽい響き(Javaなどに比べてやんちゃ)で、良いネーミングだと思います。
追記:Cool.ioはRevとは別プロジェクトでした。このコミットログをちらっと見て誤解しました。訂正してお詫びします。
イベントハンドラを登録しておいて処理を継続し、実際にイベントが発生したときにコールバックで何らかの処理をする、というのはシングルスレッドでマウスやウィンドウオブジェクトを扱うクライアントサイドJavaScriptはごく普通のことでした。Webサーバでもこれと同様にイベント駆動にすることで、ロックが発生したり、ムダにプロセスやスレッドを生成しなくても多量の同時アクセスをさばける。それがイベントループを活用したNode.jsなどのフレームワーク。というのが私の理解で、最近の注目トレンドの1つですよね。特にリアルタイム性の高い、つなぎっぱなし系プロトコルのComet(プロトコルではなくハックでしょうけど)やWebSocketでは、自然な実装という気がします(WebSocketの解説記事)。
WebSocketの登場で一気に注目を浴びた感もあるイベントループ系の実装ですが、RubyだとEventMachineというのがありました。Cool.ioは、EventMachine同様のことが、今風のDSLで書けるのが嬉しい、ということでしょうか。サンプルコードは以下の通り。
require 'rubygems' require 'cool.io' ADDR = '127.0.0.1' PORT = 4321 cool.io.server ADDR, PORT do on_connect do puts "#{remote_addr}:#{remote_port} connected" end on_close do puts "#{remote_addr}:#{remote_port} disconnected" end on_read do |data| write data end end puts "Echo server listening on #{ADDR}:#{PORT}" cool.io.run
Sinatraのような衝撃には欠けますが、イベントループ系としてはちょっと要注目なのかもしれません。