調査&再検討

持続的接続をhttpで実現する方法について調査・実験した。

方法は次の通り。クライアントとサーバをPOSTメソッドで接続する。クライアント→サーバの通信は、データをチャンク形式で少しずつ送る(もしくはContent-Lengthを長めにセットして内容を少しずつ送る)。また、その間、その接続を使って、サーバ→クライアントにデータを継続的に送信する(HTTP streamingというらしい)。

結果としては、TomcatとかResinなどのサーブレットコンテナのみで動作させる場合はうまく動くのだが、apacheを通すとうまくいかなかった。

Pushletという技術があって、そこでも、サーバ→クライアントに継続的にデータを送るということをやっているのだが、やはりapacheを通すとうまくいかないことがあるらしい(http://groups.yahoo.com/group/pushlet/message/160)。なので、その場合は、Pulletを使ってくださいみたいなことが書いてあった。Pulletってようするにクライアントからポーリングしてるだけじゃないかな?

ポーリングにすると、クライアントが問い合わせた返事としてしか、サーバ→クライアントの通信ができないことになる。したがって、サーバ→クライアントの通信に、最大30秒程度(ポーリングの間隔程度)の遅れが出るということになる。

持続的接続をhttpポーリングで実現するフレームワークを作っても良いのだが、ポーリングで十分なアプリケーションだったら、最初からポーリングで作っているだろうから必要ないかな?

サーバへの接続数に応じてポーリング時間を自動的に切り替えてくれたら便利かもしれない。接続数が少ないときは5秒間隔くらいでポーリングするのでリアルタイムなんだけれど、接続数が多くなってくると30秒間隔くらいになって遅延がでるようになってくる。うーむ微妙。