monthly gimite

試験運用中。

[tss][ruby] Tweet Search Streamの実装をem-websocketとem-http-requestに

Tweet Search StreamTwitter Streaming APIの結果をWebSocketに流す部分は、元々web-socket-rubyとnet/httpを使って1コネクション1スレッドという実装だったのですが、em-websocketem-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を深追いするのが面倒だったので、使うのを諦めました。

ソースはこちらです。