【发布时间】:2012-07-25 05:04:34
【问题描述】:
当使用Server-Sent Events时,客户端应该建立多个连接来接收它感兴趣的不同事件,还是应该只有一个连接并且客户端通过单独的通道指示它感兴趣的内容? IMO 后者似乎更可取,尽管对某些人来说它可能会使客户端代码更复杂。该规范支持命名事件(与特定主题相关的事件),这对我来说建议服务器发送事件连接应该用作所有事件的单一通道。
以下代码说明了启动多个 Server-Sent Event 连接的第一种情况:
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,并且对特定事件的兴趣将由具有服务器发送事件连接的单独请求指定,并且注册由 id 参数关联。 topic3Listener 会收到“topic3”事件,而 topic4Listener 不会。虽然需要更多的代码,但好处是只建立了一个连接,但仍然可以以不同的方式识别和处理事件。
网络上有许多示例显示了命名事件的使用,但似乎事件名称(或主题)是预先知道的,因此客户端无需向服务器注册兴趣(@987654322 @)。虽然我还没有看到显示多个 EventSource 对象的示例,但我也没有看到显示客户端使用单独的请求来注册对特定主题的兴趣的示例,就像我在上面所做的那样。我对规范的解释使我相信,表明对某个主题(或事件名称)的兴趣完全取决于开发人员,并且可以在客户知道将要接收的事件名称的情况下静态完成或客户端动态地提醒服务器它有兴趣接收特定事件。
我很想听听其他人对该主题的看法。注意:我通常是 Java 开发人员,所以请原谅我平庸的 JS 代码.. :)
【问题讨论】:
-
您可能不会在事件流中使用所有事件名称,而是可以监听“消息”事件,并且在 event.data 中您可以编码您的 topicId 和其他信息
-
是的,但是这意味着我需要在有效负载中编码此类数据,当消息识别已经是规范数据框架的一部分时,这实际上没有意义。
-
+1 !很好的问题。你最后做了什么?我也在考虑采用第二种方法。如果您分享您是否遇到任何问题,将不胜感激。
-
@JamesTyrrell 您选择了哪种解决方案?您能否用几句话分享您的经验(或者在 medium.com 上的文章中更好:))?
标签: javascript html http push server-sent-events