削除された内容 追加された内容
嘔吐彗星へのリダイレクト
m 114.180.112.56 (会話) による版を EmausBot による版へ巻き戻し
1行目:
{{otheruses|Webアプリケーション技術|その他のComet|コメット}}
#REDIRECT [[嘔吐彗星]]
{{独自研究}}
'''Comet'''(コメット)とは、[[ウェブアプリケーション|Web アプリケーション]]を構築する際に利用される技術で、この技術を使うと、[[サーバ]]で発生した[[イベント (プログラミング)|イベント]]を[[クライアント]]からの要請なしに[[クライアント]]に送信することができる。
 
Comet はこのような通信を実現するための複数の手法をまとめた概念である。これらの手法はブラウザにプラグインを追加することなく、([[Javascript]] のような)デフォルトの機能で実現されるものである。理論的には Comet は、ブラウザがデータを要求する形の既存のウェブのモデルとは異なっている。実際は Comet アプリケーションは [[Ajax]] と [[Push技術#Long polling|Long polling]] を使用してサーバ上の新規データを取得する。
 
== なぜ必要なのか ==
従来の方法では、ウェブページはクライアントからリクエストがあったときのみクライアントに配信されていた。クライアントがリクエストするたび、ブラウザはサーバへの [[Hypertext Transfer Protocol|HTTP]] コネクションを生成し、ウェブサーバはクライアントにデータを返し、そのコネクションは閉じられる。この方法の欠点は、ユーザが明示的にページのリフレッシュを行うか、またはユーザが新しいページに移動する場合にしか表示されるページが更新されないことである。ページをすべて転送するのには長い時間を要するので、ページのリフレッシュは多大な遅延を生みだす。
 
この問題を解決するために、ブラウザに変更があった部分だけをリクエスト・更新させる技術である [[AJAX]] を用いることができる。この方法だとデータ通信量が従来の方法より少なくなるため、遅延の度合も少なくなり、サイト全体のパフォーマンスは向上するといえる。さらに言えば、非同期通信を用いることにより、ユーザは段階的にデータを受信しながら作業をすることが可能になるため、その意味でもパフォーマンスは向上する。
 
しかし AJAX を用いたとしても、クライアントがあるデータを取得する前にはそれに対するリクエストを出さなければならないという苦しい問題は依然存在する。この問題は、例えば「あるユーザがデータを送ってきた」というようなサーバ上でのイベントが発生するのを待機する必要のあるアプリケーションを設計するときに大きな障害となる。
 
サーバ上でイベントが起こったかどうかを周期的に確認させる(いわゆるポールループさせる)ようにアプリケーションを設計するのはひとつの解決策である。しかしこの方法は、アプリケーションは結局サーバ上のイベントが完了したかどうかの問い合わせに多くの時間を使ってしまうため、あまりエレガントとはいえない。また、ネットワークの帯域も多く消費されてしまう。
 
== 実現手法 ==
一般的に、Web サーバはクライアントからのリクエストを受け取るとすぐにレスポンスを返す。
 
Comet を利用した Web アプリケーションでは、サーバはクライアントからのリクエストに対してすぐに応答せず、保留状態にしておき、サーバ上でなんらかのイベント(チャットで誰かが発言したなど)が発生したときにレスポンスを返す。こうすることによって、サーバで発生したイベントを即座にクライアントに送信することができる。
 
== 関連項目 ==
*[[Ajax]]
*[[メッセージ指向ミドルウェア]]
 
== 外部リンク ==
* [http://japan.cnet.com/blog/kenn/2006/09/22/entry_lingr_and_comet/ Lingr and Comet - 技術解説編] 江島健太郎
* [http://labs.cybozu.co.jp/blog/kazuho/archives/2007/02/keeping_comet_alive.php Comet の正しい使い方]
 
 
{{DEFAULTSORT:こめつと}}
{{Computer-stub}}
 
[[Category:ソフトウェアアーキテクチャ]]
[[Category:World Wide Web]]
 
[[en:Comet (programming)]]
[[es:Comet]]
[[fr:Comet (informatique)]]
[[hu:Comet]]
[[mk:Comet]]
[[nl:Comet (internet)]]
[[pt:Comet (programação)]]
[[ro:Cometa (informatică)]]
[[ru:Comet (программирование)]]
[[uk:Comet (програмування)]]