46

HTML5 SSEsとまっすぐなAjaxポーリングの間に大きな違い(パフォーマンス、ブラウザ実装可用性、サーバー負荷など)がありますか?サーバー側からは、EventSourceのように、指定されたページが〜3秒ごとに表示されているようです(ただしタイミングは柔軟であるとは思いますが)。サーバー送信イベント対ポーリング

許可されていると、タイマーを設定するよりもクライアント側でセットアップするのが簡単で、$.getはそれほど頻繁にはありませんが、他に何かありますか?ヘッダーを少なくしたり、他の魔法をやっていますか?

答えて

67

Ajaxポーリングは、HTTP接続を頻繁に確立し切断するため、多くのHTTPオーバーヘッドを追加します。 HTML5 Rocksには"Server-Sent Events"という名前が付けられているので、効率的に設計されています。

サーバー送信イベントは、1つの長寿命HTTP接続を開きます。サーバーはデータを持っているときに一方向にデータを送信します。クライアントがメッセージを要求したり、メッセージを待つ必要はありません。

Server-sentイベントの欠点の1つは、サーバーへの永続的な接続を作成するため、サーバーへの接続が数多くある可能性があるからです。いくつかのサーバーhandle massive numbers of concurrent connections better他よりも。つまり、ポーリングと同様の問題と、それらの接続を常に再確立するオーバーヘッドがあります。

サーバーによって送信されるイベントは、かなりよくsupported in most browsersです。もちろん、例外的な例外はIEです。しかし、それを修正するcouplepolyfills(およびjQuery plugin)があります。

一方向の通信だけが必要な場合は、必ずServer-sentイベントを使用します。あなたが言及したように、サーバー送信のイベントは、クライアント側で実装する方が簡単でクリーンな傾向があります。メッセージやイベントのリスナーを設定するだけで、ブラウザは切断された場合などに再接続するなどの低レベルの処理を行います。サーバー側では単純なテキストを使用するため実装が簡単です。 JSONエンコードされたオブジェクトを送信する場合は、JSON.parse()経由でクライアント上のJavaScriptオブジェクトに簡単に変換できます。

サーバーでPHPを使用している場合は、json_encode()を使用して、文字列、数値、配列、オブジェクトを正しくエンコードされたJSONに変換できます。他のバックエンド言語も同様の機能を提供します。

2

AJAXの場合、SSEはパブリッシュ・サブスクライブ・モデルであり、一定のポーリングとは対照的です。

一般に、両方の方法(ポーリングとパブリッシュサブスクライブ)は、クライアント上で最新の状態を維持する方法の問題を解決しようとしています。

1)ポーリングモデル

これは簡単です。クライアント(ブラウザ)は最初に初期状態(ページ)を取得し、更新するために、定期的に状態(ページまたはその一部)を要求し、結果を現在の状態に処理する必要があります(ページ全体をリフレッシュするか、 AJAXの場合は一部)。

もちろん、サーバの状態が何も起こらなければ、リソース(CPU、ネットワーク、...)が不必要に使用されるという欠点があります。もう1つは、状態が変わったとしても、クライアントはただちに次のポーリング期間に取得することです。しばしば、2つの事の間の良好な期間の妥協を評価する必要がある。

ポーリングの別の例は、スレッド化のスピンウェイトです。

2)パブリッシュ・サブスクライブ・モデル

それは次のように動作します(クライアント最初の要求

  • といくつかの初期状態を示している)
  • クライアントがサーバに加入するには、(おそらくと、一つのリクエストを送信します
  • サーバはクライアントへの参照をクライアント参照リポジトリにマークします
  • 状態の更新の場合se rverは、保持しているクライアントへの参照に基づいてクライアントに通知を送信します。すなわち、それは、要求に対する応答が、
  • 良いクライアントは別として、彼らは

通知の中に、より興味を持っているとき、これはSSEされていない、または待機可能イベントをスレッド内の退会、サーバによって開始されたメッセージではありません例。 前述したように、自然な欠点は、実装に応じて問題が発生する可能性のある、登録されているすべてのクライアントについてサーバーが知っていなければならないことです。

関連する問題