WebSocketのタイムアウト制御できないからKeep-Alive実装したら捗った
スポンサードリンク
Twitter Streaming APIで特定のワードをリアルタイムで流し、それをリアルタイムでブラウザに表示するサイトを作っているのですが、今日、ちょうどDTPの勉強会があるというので、その勉強会のハッシュタグを設定し、流れを見ていましたが、ツイートの間隔がかなり間延びする関係上、WebSocketのタイムアウトに引っ掛かって、ストリームが流れてこなくなるという現象が発現しました。
PCのブラウザでは300秒だったのですが、Androidのブラウザだと、300秒の前にタイムアウトになっているようでした。雰囲気的には120秒ぐらい。
つまり、勉強会に参加している人が講義に集中して、ハッシュタグ付きツイートが3分ぐらい途絶えると、途端にだんまりになります。これは困った!
そうやってだんまりになるたびにリロードをすること10数回、ついに、「こりゃ、Keep-Aliveを実装しなくちゃなるめえ」と思って、重い腰を上げたのでした。
いつぞやのコードにこんなのを追加した。
my $ka = AnyEvent->timer( after => 60, interval => 60, cb => sub { for (keys %$clients) { my $res = { mode => 'keep-alive', }; # JSON文字列に変換 my $json = $mj->encode($res); # Mojo::JSONするとutf8 fragged落ちるのでutf8 fraggedにする utf8::decode( $json ); # Mojoliciousサーバに接続中の全てのクライアントに送信 $clients->{$_}->send_message( $json ); } } );
つまり60秒ごとに意味のないデータを送信するっていうことにしてみました。
やってみたら効果覿面! 10分ツイート間隔が空いてもちゃんと接続が維持されるようになりました!
問題は、keep-aliveするのに一斉にデータを送信しているっていうことだと思います。一斉は意味がない。つうわけで、後で、ブラウザ側のタイマーで意味のない通信をすることでKeep-Aliveが実現できるかどうか試してみたいと思います。
スポンサードリンク
トラックバック(0)
トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/3775
コメントする