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コードを許してください:)
あなたが代わりにあなたは「メッセージ」イベントをリッスンすることができますし、event.dataで、あなたのTOPICIDや追加情報をエンコードすることができ、あなたのイベント・ストリーム内のすべてのイベント名で使用することはできません – 4esn0k
必ずうん、それは意味しますこのようなデータをペイロードにエンコードする必要があるのは、メッセージの識別がすでに仕様のデータフレームの一部である場合には、実際には意味をなさないことです。 –
+1!非常に良い質問。何をやったの?私はまた、第2のアプローチを考えています。あなたがそれに問題があったかどうか分かち合うと感謝します。 – brainOverflow