« 2006年09月22日 | top | 2006年09月29日 »

2006年09月23日

CometとPolling

いつのまにかLingrに頻繁にログインするようになった。
といってもkenn氏のRoomに固定だが。

その関係もあって、Cometと単なるPollingを使ったやり方について少し考えた。

たとえばMMORPGをブラウザ上に実装する場合は、
ひっきりなしに通信をするので、Cometのように待つようにしても、
Pollingをするのと比べても、大した負荷軽減にはならない。
たまにpushしてほしい少人数のチャットにはまさにうってつけだが、
ゲームやボイスチャットのようなアプリにはそれほど有用ではない。
メッセージとメッセージの間が数十秒以上空くことがほとんどなのに、
リアルタイム性が必要なアプリにのみ使えるということだ。

チャット以外でCometが応用できそうなアプリケーションにはどういうものがあるだろうか?

まず、それぞれのメンバーが等しく情報を発信するタイプのものの場合、
それぞれのチャンネルに参加する人数が少ないときにだけCometの効果がある。
これは、たとえば、麻雀や人生ゲームのようなターン制のゲームなどがあるだろう。
他にも、co-writingを可能にするための writelyのようなツールや、
共有スプレッドシートのようなアプリケーションも同様だと考えられる。
これらのツールは、ユーザーが考えたり他のことをしている時間が長く、
Cometの効果があがりやすいはずだ。

ごく限られたユーザーが情報を発信し、多数がそれをリアルタイムに
受け取る放送型の場合は、Cometを使うと、
サーバー側で多くのHTTP/TCPセッションを管理する必要が生じるために、
かなり負荷が高くなってしまう。しかし、地震など災害のお知らせでは有用だろうし、
リアルタイム性が必要とされる業務アプリケーションもあるだろう。

Cometが不要になるときは来るだろうか?
帯域とCPU、メモリの価格が下がれば不要になるだろうということはすぐ思いつく。
どれぐらい下がればよいか。
まず、チャットで考える。
Cometと同等のユーザー体験を維持するためにはkenn氏も言うように、1秒に1度はPollingしたい。
100人のユーザーがいれば、1秒間に100回Pollingされるので、
webサーバには、100 query/secの負荷がかかることになる。
チャットのサーバーのような単機能のものは、C++で普通に書くとか、
中庸を求めるならpyrexのようなツールを使って、とにかく速く動かすことができる。
C++で普通にやれば、マシン1台で、2000~3000 query/sec 以上を実現することは簡単である。
これで、2000人以上のユーザーに対応できる。しかもこのためのマシンは、
スピンドルが不要で、メンテナンスコストも低い。だからCPUやメモリという観点では問題がない。
しかし、帯域の問題が残る。
1000 query/secに必要な帯域のうち、ほとんどはHTTPのリクエストヘッダが占めることになる。
平均して400バイト以上、往復で500バイト程度、TCPのヘッダなども考慮して
念のため1kbytes程度としたら、チャットの分は誤差の範囲になることが予想される。
仮に1kbytesだとしたら、1000×1000 = 1Mbytes/sec = 8Mbit/sec
となる。100Mの回線でも、ベストエフォート型の場合は、これでかなり悲鳴が上がる。
安いFirewall製品を使っている場合は、ここもボトルネックになる可能性が出てくる。
(Cometでも実はこれと別の問題が起きるが)
1000同時接続ユーザーあたり、8Mbit/sec 
というのは、オンラインゲームよりも少ない。
MMORPGだと、かなり節約しても 10Kbit/sec程度必要になる。

チャットのフロー・コントロールは、TCPを参考にして動的にチューニングできる。
チャットのチャンネルに流れているメッセージがまばらなときはPolling頻度を下げ、
激しいときは上げるという風にできる。これを活用したら半分程度にはできるだろう。

残る関門はクライアントサイドでの負荷である。1秒に1回pollingというのは、
ブラウザにもよるが、OperaならCPUを1%程度、Firefoxなら5%程度、
IEやsafariなら10%程度、食うかもしれない。 Safari(というかOSX)は特に通信まわりが重いので、
体感して「もっさり」してしまう可能性が高い。
ここは将来改善されるだろうが、現時点では、かなり嫌な感じである。

まとめると、チャットにおいて単純にPollingするとしたら、
CPUは楽勝、帯域はつらいがゲームよりはまし、クライアントはまだまだ、
というところである。帯域の下落傾向は遅くなったがまだ下がり続けてるし、
クライアントのマルチコア化はどんどん進んでいるのでここも楽観してよい。

Cometはもうしばらくはおいしいだろう。5年ぐらいだろうか。

とか言ってると、まったく予想もできなかった用途が発見されたりするのが、
面白いところなのだが。

Posted by ringo : 11:25 | TrackBack