おさかな日誌

魚類がプログラミング

Ruby 向け非同期マルチストリーミング処理ライブラリ作った

Twitter bot に HTTP インターフェイスとか Timer 処理とかなんかいろいろそういうの付けたくて、そしたら既存の bot フレームワークの考え方だとつらそう、ということで Queue を使ったメッセージパッシング方式ならいいかんじに扱えそうじゃないかと思って書いてみた。

リポジトリ

作ってる途中に、これ Haskell の Conduit っぽいのかなと思って、ちょっと Conduit のインターフェイスを調べてみたけど、やはり Ruby でやるにはいろいろ無理があったし良くなかったのでコンポーネントの名前だけ拝借した。

実際どういう設計なのか、というのは About にそれなりにわかりやすく書いたつもりなので見てもらえるとわかりやすい気がする。

それぞれのコンポーネントに流す、加工する、消費する、という責務で切り分けて、かつその責務の中でも Twitter ストリームを取得するとか Timer でイベント発火するとかさらに責務をわけたコンポーネントを作って、最後にそれを合成して1つのコンポーネントにする、というアイディアでやった。この最後に合成するというアイディアはとても良いのだけれど、Ruby でやろうとしたらどうにもうまくできなくて力不足を感じている。今の実装はダメなスメルがすごい。

datapipes という名前にしたのだけど、これには理由があって、conduit って名前もちょっと考えたけどそんなに参考にしてないし実装もだいぶ違うから却下して、次に pipe とかって名前にしたかったけどそのへんは軒並みすでに取られていた悲しい。datapipe も取られていた悲しいので、datapipes という名前にした。

作ってる Botこれ でまだ複数のストリームを読むとかはしてないんだけどいい感じに処理の抽象ができてるから、datapipes の設計としては良さそう。

ただ Concurrency と付き合うのはなにぶん初めて、実装は拙いというのを感じている。