[tss][ruby] Tweet Search Streamの実装をem-websocketとem-http-requestに
Tweet Search StreamでTwitter Streaming APIの結果をWebSocketに流す部分は、元々web-socket-rubyとnet/httpを使って1コネクション1スレッドという実装だったのですが、em-websocketとem-http-requestを使うように変更しました。Webサーバもthinなので、これで全てEventMachineの上に乗って、ほぼ1スレッドで全部動くようになりました。余計な排他処理が要らなくなったのはいいですね。パフォーマンスも良くなったことに期待ですが、測ってはいないです。まあ元々今ぐらいのアクセス数だと負荷は問題なかったんですが。
実装にはkennさんの記事が参考になりました。1点変更が必要だったのが
http = EM::HttpRequest.new(STREAMING_URL).get :head => { 'Authorization' => [ 'USERNAME', 'PASSWORD' ] }
という部分で、
http = EM::HttpRequest.new(STREAMING_URL).get :head => { 'Authorization' => [ 'USERNAME', 'PASSWORD' ] }, :timeout => 0
としないと、ストリームが10秒以上止まるとそこで接続が切れてしまいます(:timeoutのデフォルトが10なので)。この記事が書かれた当時は要らなかったのかもしれませんが。
ちなみにtwitter-streamというのも見つけたのですが、なぜかOAuthの認証に失敗します。OAuthを深追いするのが面倒だったので、使うのを諦めました。
ソースはこちらです。