在HTML5 SSEs和直接Ajax轮询之间是否存在很大差异(在性能,浏览器实现可用性,服务器负载等方面)?从服务器端看,似乎EventSource
每隔约3秒左右才会到达指定的页面(虽然我知道时间很灵活)。
当然,在客户端设置比设置计时器并且经常使用$.get
更简单,但还有其他什么吗?它会发送更少的标题,还是做其他一些我不知道的魔法?
答案 0 :(得分:73)
Ajax轮询增加了大量的HTTP开销,因为它不断建立和拆除HTTP连接。由于HTML5 Rocks将“服务器发送事件放在另一方面,因此从头开始设计为高效。”
服务器发送的事件打开一个长期存在的HTTP连接。然后,服务器在有数据的情况下单向发送数据,客户端无需请求数据或执行任何操作,只需等待消息。
服务器发送事件的一个缺点是,由于它们与服务器建立了持久连接,因此您可能与服务器建立了许多打开的连接。有些服务器handle massive numbers of concurrent connections better比其他服务器多。也就是说,你会遇到类似的轮询问题以及不断重新建立连接的开销。
服务器发送的事件非常好supported in most browsers,当然是IE的明显例外。但有一个couple polyfills(以及jQuery plugin)可以解决这个问题。
如果您正在做一些只需要单向通信的事情,我肯定会选择服务器发送的事件。正如您所提到的,在客户端执行服务器发送的事件往往更简单,更清晰。你只需要设置消息和事件的监听器,浏览器就会处理低级别的东西,比如重新连接,如果断开连接等等。在服务器端,它也很容易实现,因为它只使用简单的文本。如果您发送JSON编码对象,则可以通过JSON.parse()
轻松将它们转换为客户端上的JavaScript对象。
如果您在服务器上使用PHP,则可以使用json_encode()
将字符串,数字,数组和对象转换为正确编码的JSON。其他后端语言也可能提供类似的功能。
答案 1 :(得分:3)
我只会对所说的内容添加更高的视角,那就是SSE是发布 - 订阅模型,而不是AJAX的常规轮询。
通常,两种方式(轮询和发布 - 订阅)都试图解决如何在客户端上维护最新状态的问题。
1)轮询模型
很简单。客户端(浏览器)首先获得初始状态(页面)并且要进行更新,它需要定期请求状态(页面或其部分)并将结果处理为当前状态(刷新整个页面或将其呈现在其中部分适用于AJAX)。
当然,一个缺点是如果服务器状态没有发生,则不必要地使用资源(CPU,网络......)。另一个是,即使状态发生变化,客户端也只能在下一个轮询期间获得它,而不是尽快。人们经常需要评估这两件事之间的良好时期妥协。
轮询的另一个例子是线程中的spinwait。
2)发布 - 订阅模型
它的工作原理如下:
这是SSE,或者在线程中进行等待事件,作为另一个例子。 如上所述,一个自然的缺点是服务器必须知道所有订阅的客户端,这取决于实现,可能是一个问题。