M.C.P.C.

―むり・くり―プラスコミュニケーション(更新終了)


| トップページ |

2011年11月19日 18:23

WebSocketのタイムアウト制御できないからKeep-Alive実装したら捗った

このエントリーをはてなブックマークに追加 mixiチェック

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が実現できるかどうか試してみたいと思います。

投稿 大野 義貴 [Web] | |

トラックバック(0)

トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/3775

コメントする