2012-07-26 106 views
11

当使用Server-Sent Events时,客户端应该建立多个连接来接收它感兴趣的不同事件,或者应该有单个连接,并且客户端通过单独的通道表明它感兴趣的是什么?海事组织后者似乎更可取,尽管对某些人来说可能会使客户端代码更加复杂。该规范支持命名事件(与特定主题相关的事件),这对我来说建议将Server-Sent Events连接用作所有事件的单个通道。每个应用程序应该只有一个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会收到“标题2”的事件。虽然这是非常简单的,也有挂非常低效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不会。虽然需要更多的代码,但好处是只能建立一个连接,但事件仍然可以被识别和处理。

网络上有很多示例显示使用命名事件,但似乎事件名称(或主题)事先已知,因此不需要客户端注册服务器的兴趣(example )。虽然我还没有看到一个显示多个EventSource对象的例子,但我也没有看到过一个例子,显示客户使用单独的请求来注册对特定主题的兴趣,正如我上面所做的。我对规范的解释使我相信,对某个主题(或事件名称)表示兴趣完全取决于开发人员,并且可以通过客户端知道要接收的事件的名称或动态地与客户端通知服务器它有兴趣接收特定事件。

我会很有兴趣听到别人对这个话题的想法。注:我通常是一个Java开发,所以请原谅我平庸的JS代码.. :)

+0

您可能不会在事件流中使用所有事件名称,而是可以侦听“消息”事件并在event.data中编码topicId和其他信息 – 4esn0k 2012-07-27 17:34:26

+0

是的,但这意味着我需要将这些数据编码在有效载荷中,这在消息识别已经成为规范数据框架的一部分时并不合理。 – 2012-07-31 01:44:09

+1

+1!非常好的问题。你最终做了什么?我也在考虑采用第二种方法。如果你分享你是否遇到过任何问题,将不胜感激。 – brainOverflow 2013-06-07 16:51:27

回答

3

我会强烈建议,恕我直言,你有一个EventSource对象每SSE提供服务,然后发出使用不同类型的消息。

但是,最终取决于消息类型的相似程度。例如,如果您有5种不同类型的与用户相关的消息,请使用用户EventSource并区分事件类型。

如果你有一个关于用户的事件类型,另一个关于三明治,我会说他们保持在不同的服务,因此EventSource s。

这是一个不错的想法,可以像使用宁静的服务一样思考分解EventSources。如果你不会从AJAX的同一服务中获得两件东西,那么你可能不应该从同一个EventSource获取它们。

+0

这是否规模? – nilskp 2017-12-01 00:34:28

0

作为对模糊和宽容的浏览器标准解释*的回应,浏览器供应商对允许单个域/端口的持久连接数量实施了不一致的限制。由于每个接收异步上下文的事件接收者在该接收者打开时都假设有一个持久连接分配,因此严格限制EventSource侦听者的数量至关重要,以避免超出不同的供应商特定限制。实际上,这限制了每个应用程序大约6个EventSource /异步上下文对。降级是优雅的(例如,额外的EventSource连接请求只会等待一个插槽可用),但请记住必须有可用的连接来检索页面资源,响应XHR等。

* W3C已颁布标准尊重包含语言的持续连接“......应限制同时连接的数量......”此语言表示该标准不是强制性的,因此供应商合规性是可变的。 http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html#sec8.1.4

相关问题