服务器发送的事件与轮询

Ina*_*thi 57 html5 server-side javascript-events ajax-polling server-sent-events

HTML5 SSE和直接的Ajax轮询之间是否存在很大差异(在性能,浏览器实现可用性,服务器负载等方面)?从服务器端看,它似乎EventSource只是每隔约3秒左右点击指定的页面(虽然我知道时间是灵活的).

当然,在客户端设置比设置定时器并且$.get经常使用它更简单,但还有其他什么吗?它会发送更少的标题,还是做其他一些我不知道的魔法?

Use*_*ode 77

Ajax轮询增加了大量的HTTP开销,因为它不断地建立和拆除HTTP连接.正如HTML5 Rocks所说的"另一方面,服务器发送事件,从头开始设计为高效."

服务器发送的事件打开一个长期存在的HTTP连接.然后服务器在拥有数据时单向发送数据,客户端无需请求数据或执行任何操作,只需等待消息.

服务器发送事件的一个缺点是,由于它们创建了与服务器的持久连接,因此您可能与服务器建立了许多打开的连接.有些服务器比其他服务器更好地处理大量并发连接.也就是说,你会遇到类似的轮询问题以及不断重新建立这些连接的开销.

大多数浏览器都很好地支持服务器发送的事件,当然是IE的明显例外.但也有一对夫妇polyfills(和jQuery插件),将解决这个问题.

如果你正在做一些只需要单向沟通的事情,我肯定会选择服务器发送的事件.正如您所提到的,在客户端执行服务器发送的事件往往更简单,更清晰.你只需要设置消息和事件的监听器,浏览器就会处理低级别的东西,比如重新连接,如果断开连接等等.在服务器端,它也很容易实现,因为它只使用简单的文本.如果您发送JSON编码对象,您可以通过它轻松地将它们转换为客户端上的JavaScript对象JSON.parse().

如果您在服务器上使用PHP,则可以使用json_encode()将字符串,数字,数组和对象转换为正确编码的JSON.其他后端语言也可以提供类似的功能.

  • 但是服务器端的资源呢?每5秒1个ajax请求比永远为每个用户保持连接更好吗? (2认同)

小智 5

我只会对所说的内容添加一个更高的观点,那就是 SSE 是发布订阅模型,而不是在 AJAX 的情况下进行持续轮询。

通常,两种方式(轮询和发布订阅)都试图解决如何在客户端上保持最新状态的问题。

1) 轮询模型

很简单。客户端(浏览器)首先获得一个初始状态(页面),为了更新它,它需要定期请求状态(页面或其部分)并将结果处理为当前状态(刷新整个页面或智能地将其呈现为它的状态)部分在 AJAX 的情况下)。

当然,一个缺点是如果服务器状态没有任何反应,资源(CPU、网络等)就会被不必要地使用。另一个是,即使状态发生变化,客户端也只能在下一个轮询期间获得它,而不是尽快。人们通常需要评估两件事之间的良好时期。

轮询的另一个例子是线程中的自旋等待。

2)发布订阅模型

它的工作原理如下:

  • (客户端首先请求并显示一些初始状态)
  • 客户端订阅服务器(发送一个请求,可能带有一些上下文,如事件源)
  • 服务器将对客户端的引用标记为其某个客户端引用存储库
  • 在状态更新的情况下,服务器根据对它持有的客户端的引用向客户端发送通知;即它不是对请求的响应,而是由服务器发起的消息
  • 好的客户在对通知不再感兴趣时取消订阅

作为另一个例子,这是 SSE,或在线程等待事件中。如前所述,一个自然的缺点是服务器必须知道所有订阅的客户端,这取决于实现,这可能是一个问题。