Ruby版BayServerを開発する際、セレクタが必要になったので実装してみました。
BayServerは、横浜ベイキット(http://baykit.yokohama) が開発している爆速Webサーバーで、Ruby、Python、PHPなどさまざまな言語で開発されています。
セレクタとは、JavaやPythonで取り入れられているソケットやパイプを扱うためのAPI(クラス)で、select関数などの低レベルのソケットAPIに比べて色々とメリットがあります。
メリットはこんなところでしょうか
- 低レベルなソケットAPIは使い方にクセがあり少し使いづらいのを分かりやすいメソッドにしてくれている
- select, epoll, kqueue など、プラットフォームによるソケットAPIの実装を隠蔽できる
実際、とても扱いやすいクラスだと思います。
で、JavaやPythonでのセレクタの使い方としては
- セレクタのインスタンスを作成する
- 監視したいソケットやパイプを登録する。登録する際は何をしたいか(読み込み/書き込み)も指定する
- selectメソッドを呼び監視を開始する(ここでブロックされる)
- 読み込みや書き込みが可能になったらselectメソッドから返る
- 読み込みや書き込みの処理を行う
実際、従来のselectやepollなんかを使って書くのに比べて、メッチャ書きやすいし分かりやすいです。
で、BayServerの話に戻りますが、BayServerでは、実装言語が違っても、クラス構造やメソッド名、その中身のロジックは全く同じになるように記述されています。
ところが、RubyにはセレクタのAPIがないので、JavaやPythonのようには書けないんですね。
なのでSelectorクラスを実装してみました。
コードはGitHub上のを参照してください。
今は、内部的に従来のselect関数を使っていますが、selectは制限が多いので、今後epollやkqueueなども扱えるようにしたいと思っています。(まあ、今のところこれで十分なので、リクエストがあればですが笑)
と言うわけで、BayServerをよろしくお願いします!