HTML5 SSE和直接 Ajax 轮询之间是否存在很大差异(在性能、浏览器实现可用性、服务器负载等方面) ?从服务器端来看,似乎EventSource
每隔 3 秒左右就会访问指定的页面(尽管我知道时间是灵活的)。
诚然,在客户端进行设置比设置一个计时器并$.get
每隔一段时间设置一次要简单,但是还有什么其他的吗?它会发送更少的标题,还是会做一些我错过的其他魔法?
HTML5 SSE和直接 Ajax 轮询之间是否存在很大差异(在性能、浏览器实现可用性、服务器负载等方面) ?从服务器端来看,似乎EventSource
每隔 3 秒左右就会访问指定的页面(尽管我知道时间是灵活的)。
诚然,在客户端进行设置比设置一个计时器并$.get
每隔一段时间设置一次要简单,但是还有什么其他的吗?它会发送更少的标题,还是会做一些我错过的其他魔法?
Ajax 轮询增加了很多 HTTP 开销,因为它不断地建立和断开 HTTP 连接。正如HTML5 Rocks所说,“另一方面,服务器发送的事件从一开始就被设计为高效。”
服务器发送的事件打开一个长期存在的 HTTP 连接。然后服务器在拥有数据时单向发送数据,客户端无需请求或执行任何操作,只需等待消息。
服务器发送事件的一个缺点是,由于它们创建了与服务器的持久连接,因此您可能与服务器有许多打开的连接。一些服务器比其他服务器更好地处理大量并发连接。也就是说,您会遇到类似的轮询问题以及不断重新建立这些连接的开销。
大多数浏览器都很好地支持服务器发送的事件,当然 IE 是显着的例外。但是有几个polyfills (和一个jQuery 插件)可以解决这个问题。
如果您正在做一些只需要单向通信的事情,我肯定会使用服务器发送的事件。正如您所提到的,服务器发送的事件在客户端实现起来往往更简单、更清晰。您只需要为消息和事件设置侦听器,浏览器会处理低级别的事情,例如在断开连接时重新连接等。在服务器端,它也很容易实现,因为它只使用简单的文本。如果您发送 JSON 编码的对象,您可以通过JSON.parse()
.
如果您在服务器上使用 PHP,您可以使用json_encode()
将字符串、数字、数组和对象转换为正确编码的 JSON。其他后端语言也可能提供类似的功能。
我只会为所说的增加一个更高的视角,那就是 SSE 是发布-订阅模型,而不是 AJAX 的持续轮询。
通常,两种方式(轮询和发布-订阅)都试图解决如何在客户端上保持最新状态的问题。
1) 轮询模型
很简单。客户端(浏览器)首先获得一个初始状态(页面),为了更新它,它需要定期请求状态(页面或其部分)并将结果处理为当前状态(刷新整个页面或将其智能渲染到它的AJAX 的一部分)。
自然地,一个缺点是如果服务器状态没有发生任何事情,则资源(CPU、网络等)会被不必要地使用。另一个问题是,即使状态发生变化,客户端也只能在下一个轮询期间获得它,而不是尽快获得。人们经常需要评估两件事之间的良好时期折衷。
轮询的另一个例子是线程中的 spinwait。
2)发布订阅模型
它的工作原理如下:
这是 SSE,或在线程内等待事件,作为另一个示例。如前所述,一个自然的缺点是服务器必须知道其所有订阅的客户端,这取决于实现,这可能是一个问题。