2012-07-26 12 views
11

Server-Sent Eventsを使用する場合、クライアントは異なるイベントを受信するために複数の接続を確立する必要がありますか、または1つの接続が存在する必要があり、クライアントは別のチャネルを介して何が関心があるかを示しますか? IMOは後者のほうが望ましいと思われますが、クライアントコードを複雑にするものもあります。この仕様では、名前付きイベント(特定のトピックに関連するイベント)がサポートされています。これは、サーバー送信イベント接続をすべてのイベントの単一チャネルとして使用する必要があることを示唆しています。アプリケーションごとに1つのEventSourceオブジェクトが必要ですか?

次のコードは、複数のサーバーに送信され、イベントの接続が開始された最初のシナリオを示しています

var EventSource eventSource1 = new EventSource("events/topic1"); 
eventSource1.addEventListener('topic1', topic1Listener, false); 

var EventSource eventSource2 = new EventSource("events/topic2"); 
eventSource2.addEventListener('topic2', topic2Listener, false); 

eventSource1は「topic1」イベントを受け取ることになるとeventSource2は「topic2」イベントを受け取ることになります。これはかなりまっすぐ進むことがぶら下がっはあなたが興味のあるトピックごとに発生GETしても、かなり非効率的であるされている間

の代替には、次のようなものです:この例では

var EventSource eventSource3 = new EventSource("/events?id=1234") 
eventSource3.addEventListener('topic3', topic3Listener, false); 
eventSource3.addEventListener('topic4', topic4Listener, false); 

var subscription = new XMLHttpRequest(); 
subscription.open("PUT", "/events/topic3?id=1234", true); 
subscription.send(); 

単一のEventSourceう特定のイベントへの関心は、Server-Sentイベント接続での別の要求によって指定され、登録はidパラメータによって関連付けられます。 topic3Listenerは "topic3"イベントを受信し、topic4Listenerは受信しません。わずかに多くのコードを必要とする一方で、単一の接続のみが行われるという利点がありますが、イベントは引き続き識別され、別々に処理されます。

ウェブ上に名前付きイベントの使用例がありますが、イベント名(またはトピック)が事前に分かっているので、クライアントがサーバーに興味を持って登録する必要はありません(example )。私はまだ複数のEventSourceオブジェクトを表示している例は見ていませんが、上記のように、特定のトピックへの関心を登録するために別の要求を使用しているクライアントを示す例は見ていません。私の仕様の解釈は、特定のトピック(またはイベント名)への関心が開発者次第であること、クライアントが受信しようとしているイベントの名前を知っていることを静的にクライアントが特定のイベントの受信に関心があることをサーバーに警告することで動的に実行されます。

私はこのトピックに関する他の人の考えを聞くことにかなり興味があります。 NB:私は通常Java開発者ですので、平凡なJSコードを許してください:)

+0

あなたが代わりにあなたは「メッセージ」イベントをリッスンすることができますし、event.dataで、あなたのTOPICIDや追加情報をエンコードすることができ、あなたのイベント・ストリーム内のすべてのイベント名で使用することはできません – 4esn0k

+0

必ずうん、それは意味しますこのようなデータをペイロードにエンコードする必要があるのは、メッセージの識別がすでに仕様のデータフレームの一部である場合には、実際には意味をなさないことです。 –

+1

+1!非常に良い質問。何をやったの?私はまた、第2のアプローチを考えています。あなたがそれに問題があったかどうか分かち合うと感謝します。 – brainOverflow

答えて

3

私は、SSE提供サービスごとにEventSourceオブジェクトを1つ持っていることを強くお勧めします。 。

最終的には、メッセージの種類がどれほど似ているかによって異なります。たとえば、ユーザーに関連する5種類のメッセージがある場合は、ユーザーにEventSourceを割り当て、イベントタイプと区別します。

ユーザーについてのイベントタイプが1つで、サンドイッチに関するイベントタイプが1つある場合は、別のサービスでそれらを維持しているとします(EventSource)。

安心してサービスを提供するのと同じ方法でEventSourcesを分割することをお勧めします。 AJAXで同じサービスから2つのものを取得しない場合は、おそらく同じEventSourceから取得するべきではありません。

+0

スケールはありますか? – nilskp

0

漠然としたブラウザ標準の解釈*に対応して、ブラウザベンダーは、単一のドメイン/ポートに許可されている持続的な接続の数に一貫性のない制限を実装しています。非同期コンテキストに対する各イベントレシーバは、そのレシーバが開いている限り、単一の永続的な接続割り当てを想定しているため、さまざまなベンダー固有の制限を超えないように、EventSourceリスナの数を厳密に制限することが重要です。実際には、アプリケーションあたり約6つのEventSource/asyncコンテキストペアに制限されます。 (例:EventSourceの追加接続要求がスロットが利用可能になるまで待つだけの場合)ただし、ページリソースを取得したり、XHRに応答する接続が必要であることに注意してください。

※W3Cは、 "...同時接続の数を制限しなければならない..."という言語を含む永続的な接続に関しては、この言語は標準が必須ではなく、ベンダーのコンプライアンスが可変であることを意味します。 http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html#sec8.1.4

関連する問題