ワシはワシが育てる

週刊少年ジャンプと任天堂のゲームが三度のメシより好きです。

『RailsでWebSocketを使う』の続き

過疎なこのブログで地味ながらもはてブされている『RailsでWebSocketを使う』の続きというか感想です。

この記事を書いてからレガシーブラウザにも対応しているFayeも含め、Railsを用いたリアルタイム処理について試行錯誤したのですが、結論としてRailsでリアルタイム処理は余り向いていないということで固まりつつあります。

リアルタイム処理の性質上、Rubyのアプリケーションはイベント駆動に対応したサーバーである必要があり、その代表格としてthinがありますが、thinは残念ながらスケーラビリティに乏しく、また運用面で扱いづらいところがあるので本番環境で使うにはなかなか難しいです。

(ただ上で「結論として」とか言っている割に他にもRailbowsなどは試していないです。ごめんなさい。)

またイベント駆動とはいっても、Node.jsのような非同期処理と比べて小回りが利かない面が気にかかります。

例えばファイルを10個アップロードして、一つアップロードが完了するごとにサーバー側から通知が来るプログラムを書く場合、Rubyでは通常それを実現することができません。(とはいえ非同期処理をする手段もあります)

10.times do
  # 以下の構文でクライアントへ通知する
  send_message :file_upload, n
end

上のような処理の場合、10回のループが終了して初めて通知が10個まとめて送られますが、node.jsを使えば非同期に処理がなされるので一つ一つの処理が終わる度に通知が送られます。

// 同じような書き方をするためにunderscore.jsを使う
_(10).times (function (n) {
  socket.emit('file_upload', n)
});

リアルタイムアプリケーションと非同期処理の相性が非常に良く、またスケーラビリティでもnode.jsに分があります。

websocket-railsやfayeは既存のRailsアプリケーションを活かしてリアルタイム処理を行えるのは魅力的ですが、実運用するには難しい面があるのではないかと思った次第です。