66

HTML5 SSEとストレートアップAjaxポーリングの間に(パフォーマンス、ブラウザー実装の可用性、サーバー負荷などの点で)大きな違いはありますか?EventSourceサーバー側から見ると、指定されたページに3秒程度おきにヒットしているように見えます(タイミングは柔軟だと思いますが)。

確かに、タイマーを設定して頻繁に使用するよりも、クライアント側で設定する方が簡単$.getですが、他に何かありますか?送信するヘッダーが少なくなりますか、それとも私が見逃している他の魔法を実行しますか?

4

2 に答える 2

89

Ajaxポーリングは、HTTP接続を絶えず確立および切断しているため、多くのHTTPオーバーヘッドを追加します。HTML5 Rocksが言うように、「一方、サーバー送信イベントは、効率的になるようにゼロから設計されています」。

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

サーバー送信イベントの欠点の1つは、サーバーへの永続的な接続が作成されるため、サーバーへの接続が多数開いている可能性があることです。一部のサーバーは、他のサーバーよりも大量の同時接続をより適切に処理します。とはいえ、ポーリングに加えて、これらの接続を絶えず再確立するオーバーヘッドについても同様の問題が発生します。

サーバーから送信されたイベントは、ほとんどのブラウザーで非常によくサポートされていますが、注目すべき例外はもちろんIEです。しかし、それを修正するポリフィル(およびjQueryプラグイン)がいくつかあります。

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

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

于 2012-03-03T09:12:55.990 に答える
6

私は言われたことにもっと高い視​​点を追加するだけです、そしてそれはSSEがAJAXの場合の一定のポーリングとは対照的にパブリッシュ/サブスクライブモデルであるということです。

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

1)ポーリングモデル

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

当然、1つの欠点は、サーバーの状態で何も起こらない場合、リソース(CPU、ネットワークなど)が不必要に使用されることです。もう1つは、状態が変化した場合でも、クライアントは次のポーリング期間でのみ取得し、できるだけ早く取得しないことです。多くの場合、2つのことの間の適切な期間の妥協点を評価する必要があります。

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

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

次のように機能します。

  • (クライアントは最初に要求し、いくつかの初期状態を示します)
  • クライアントはサーバーにサブスクライブします(おそらくイベントソースなどのコンテキストで1つの要求を送信します)
  • サーバーは、クライアントへの参照をそのクライアント参照リポジトリにマークします
  • 状態が更新された場合、サーバーは、保持しているクライアントへの参照に基づいてクライアントに通知を送信します。つまり、リクエストへの応答ではなく、サーバーによって開始されたメッセージです。
  • 優れたクライアントは、通知に関心がなくなったときに登録を解除します

別の例として、これはSSE、または待機可能なイベントのスレッド内です。前述のように、自然な欠点は、サーバーがサブスクライブされたすべてのクライアントについて認識している必要があることです。これは、実装によっては問題になる可能性があります。

于 2017-01-15T10:58:14.757 に答える