Cometと同時接続数制限

HTTPプロキシを通してCometサーバーに接続する場合や、1つブラウザで複数のタブを開いてCometサーバーに接続する場合、同時接続数制限が問題になる。

Cometでは1つのリクエストに対して応答を遅らせるため、クライアント1台がコネクションを1本占有してしまう(pipeliningが無い場合)。
またRFC 2616に、サーバーに対して2コネクション以上張らないようにするべきと書いてある。


ここで、HTTPプロキシの裏に複数のクライアントがいる場合などは、クライアントが3台いるのに2本しかコネクションが使えなかったりする。そうすると1台はリクエストをサーバーに投げられず、サーバーからメッセージを受け取れない。また、クライアントからサーバーへメッセージ送れなくなってしまう。

サーバーから見ると、クライアントがいなくなったのか、同時接続数制限でリクエストが到達しなくなってしまったのかは区別できないので、そのうちタイムアウトする。その間のメッセージはクライアントに送られることなく捨てられてしまう。


同時接続数問題の回避

ブラウザやHTTPプロキシの挙動を調べてみると、同時接続数の制限は、サーバーのホスト名に対してかかるらしい。「1.example.com」に対して2本、「2.examle.com」に対して2本という具合。
そこで、1台のサーバーをいろいろなホスト名で引けるようにしておけば、同時接続数制限を回避できる。Lingrもこの方法を使っているらしい(79.www.linger.comなど)

クライアントからサーバーへメッセージを送るホスト名も別に用意しておく。post.example.comとか。これでlong-pollingの影響を受けずにサーバーにリアルタイムでメッセージを送れる。