CometによるデータPush

 Cometはイベント駆動によるサーバプッシュ型の技術です。クライアントからの要求によって生成されたHTTPコネクションを永続保持し、サーバ側でイベントが発生したタイミングで保持コネクションに対して応答を返します。

 従来のWebアプリケーションは、下図のようにクライアントからの要求によりその時点でのデータを取得します。

 


 リアルタイム性を求めるのなら、1のポーリング間隔を短くする必要がありますが、クライアント、サーバ、ネットワークにそれだけ負荷がかかることになります。

 クライアント、サーバ、ネットワークの負荷を軽減するには、ポーリング間隔を長くすることが簡単ですが、2のように更新されたデータを表示するまでに遅延が発生し、リアルタイム性が損なわれます。


 Cometを利用したWebアプリケーションの場合、下図のようにユーザ要求に対する応答に限定されず、好きなときにクライアントにデータを配信できます。

 


クライアントから発行されたHTTPコネクションをサーバはつかみっぱなしにし(※1)、イベントの発生したタイミングでクライアントに通知します。この時、HTTPコネクションは、閉じないようにします。HTTPのタイムアウトが発生しないように、一定の間隔でクライアントとの通信を発生させる必要があります(※2)

 サーバはHTTPコネクションを保持しているので、データの更新イベント等を受け取った場合、すぐさまクライアントにデータを配信することができます(※3)。クライアントはブラウザの「受信データから順次に解析を行う」という性質を利用して、受信データを画面に表示します。

Cometは非同期と言う点で Ajax とよく似ていますが、Comet スタイルで実装されるアプリケーションは状態の変更をほとんど気が付かない程度の遅延で通知できます。

 リアルタイム性に効果的なこのスタイルですが、問題がないわけではありません。クライアント⇔サーバ間の通信負荷は軽減させることができますが、サーバの負荷は逆に増大します。HTTPコネクションがつなぎっぱなしになっているので、サーバ側の資源の解放がされません。また、イベント駆動にしていたとしても、待機中のスレッドはメモリとCPUを消費します。

前へ 次へ