Perlでモダンなネットワークサーバーを書くには

Comet については、普及するかどうかという以前に、どう使えばいいのか、正しく使った場合に何をどこまでできるのか、という理解が共有されていないように思います。なので、(あくまで私見ですが) 使用したスライドの一部を公開したいと思います。よろしければごらんください。

サイボウズラボの奥さんによる Comet のサーバー周りの資料。すばらしい。C10K に対してどのようなアーキテクチャをとるのが良いかとの考察が特に勉強になりました。

また、問題や改善すべき点があれば、教えていただければ幸いです。

というので問題、改善すべきというわけではないですが Perl 周りの話で少し補足を。

資料中の「初心者へのオススメが PoCo::Server::HTTP でパフォーマンスが欲しい人には Sys::Syscall qw/:epoll/」の点。おそらく Perl でも epoll を使えますよということだと思いますが、そこは Perl らしく色々やり方があります。

POE はデフォルトではファイルディスクリプタの監視に select(2) を使いますが、POE::Loop の実装を切り替えることでその他の API を使うように挙動をカスタマイズできます。POE::Loop::Epoll を使えばあら不思議、一行追加するだけで POE サーバが epoll 対応になります。(poll(2) を使いたい場合は use POE する前に use IO::Poll すれば OK)

POE はちょっとフレームワークとしてでかいから、という場合は Sys::Syscall を使うのもいいですが、Sys::Syscall だけだと epoll 関連の API を素で書かなきゃいけないのでコードがちょっと複雑になりがち。そこで POE よりもライトな実装でイベント駆動がいいなあという場合は Event::Lib を使うと良いでしょう。Event::Lib は memcached などでも使われている libevent の Perl バインディング。Linux の epoll だけでなく BSD の kqueue や Solaris の devpoll なども抽象化して同じインタフェースで扱える上、イベント駆動のプログラミングモデルを提供してくれます。

他にも epoll する実装でイベント駆動ライブラリといえば Perlbal や MogileFS でおなじみの Danga::Socket なんてのもあります。ちょっとドキュメント不足なのが苦労するかもしれませんが、Perlbal や MogileFS ですでに稼動実績のあるサンプルソースがあるのは強い味方です。

と、この辺の話を、UNIX ネットワークプログラミングの一歩からここまで至る経緯も含めて 4 月の YAPC::Asia で話す予定です。YAPC はいよいよ タイムテーブルが発表になりましたね。