Comet(コメット)とは
Cometとは、Webアプリケーションにおいて、
サーバーで発生したイベントをクライアントからのリクエストなしに、リアルタイムにクライアントへ送信する技術の総称です。この技術を用いることで、従来のWebのモデルとは異なり、
サーバー側から能動的にクライアントへデータを送信できます。
Cometは、特定の技術を指すのではなく、このようなプッシュ型通信を実現するための複数の手法をまとめた概念です。これらの手法は、ブラウザの標準機能である
JavaScriptなどを活用し、プラグインなしで実現できます。
なぜCometが必要なのか
従来のWebでは、クライアントからのリクエストに応じて
サーバーがレスポンスを返すというモデルが一般的でした。このモデルでは、クライアントが明示的にページをリフレッシュするか、別のページへ移動しない限り、表示内容は更新されません。ページ全体を転送する場合、時間もかかり、ユーザー体験を損ねる要因となっていました。
Ajaxの登場により、ページ全体をリロードせずに一部だけを更新できるようになり、ユーザー体験は大幅に向上しました。しかし、
Ajaxでも、クライアントからのリクエストが必要であるという根本的な課題は残ったままでした。例えば、チャットのようなリアルタイム性が求められるアプリケーションでは、クライアントが定期的に
サーバーへ問い合わせをする必要があり、非効率でした。
ポーリングという、
サーバーに定期的に更新を確認する方法もありますが、これは
サーバーに常に負荷をかけ、ネットワーク帯域も無駄に消費してしまいます。Cometは、このような問題を解決するために生まれました。
Cometの実現手法
Cometでは、クライアントからのリクエストに対して、
サーバーがすぐにレスポンスを返すのではなく、レスポンスを保留しておきます。そして、
サーバー側でイベントが発生した際に、保留しておいたレスポンスを返します。これにより、
サーバーで発生したイベントを即座にクライアントへ通知できます。
Cometを実現するための代表的な手法として、以下のものがあります。
Long Polling: クライアントがサーバーにリクエストを送り、サーバーはイベントが発生するまでレスポンスを保留します。イベントが発生したらレスポンスを返し、クライアントは再びリクエストを送ります。この処理を繰り返すことで、リアルタイムな通信を実現します。
Streaming: サーバーがクライアントからのリクエストに対して、データを連続的に送信します。この手法は、データの更新が頻繁に行われる場合に適しています。
iframe: 非表示のiframeを使い、サーバーからクライアントへのプッシュ通知を実現する手法です。サーバーは、iframeの内容を更新することでクライアントに情報を伝えます。
Cometは、既存の技術を組み合わせたことで、プッシュ型通信を実現しましたが、これらの技術は本来、双方向通信を想定して作られたものではありませんでした。そのため、処理が複雑になり、実装が難しいという問題点がありました。2011年には、初めから双方向通信を想定して作られたWebSocketが定義され、より効率的なリアルタイム通信が可能になりました。現在では、WebSocketがリアルタイムWebアプリケーションで主流となっています。
まとめ
Cometは、Webアプリケーションにおけるプッシュ型通信の先駆けとなる技術でした。既存の技術を応用することで、リアルタイムなデータ更新を可能にし、よりインタラクティブなWeb体験を実現しました。WebSocketの登場により、Cometの役割は縮小しましたが、その技術的な知見は今もなお価値があります。
関連項目
Ajax'>
Ajax
WebSocket'>WebSocket
メッセージ指向ミドルウェア
外部リンク
Lingr and Comet - 技術解説編 江島健太郎
Comet の正しい使い方