WebSockets在什么时候比Polling效率低?

问题描述 投票:8回答:2

虽然我理解上述问题的答案在某种程度上取决于您的应用程序的架构,但我主要对非常简单的场景感兴趣。

基本上,如果我的应用程序每隔5秒钟进行一次ping更改,或者每分钟一次,那么发送数据以保持打开的Web套接字连接的时间最终会超过简单轮询所浪费的数量?

基本上,我感兴趣的是,如果应用程序不一定需要实时更新,而只是定期检查,那么通过使用像Meteor这样的框架可以量化多少效率。

请注意,我的重点是带宽利用率,而不一定是数据库访问时间,因为像Meteor这样的框架具有高度优化的方法,只请求更新数据库。

performance optimization websocket polling
2个回答
13
投票

websocket连接的重点在于您无需ping应用程序以进行更改。相反,客户端只连接一次,然后服务器可以直接发送客户端更改,只要它们可用。客户永远不必问。服务器只在可用时发送数据。

对于任何类型的服务器启动数据,带宽比http轮询更有效。除了给你更及时的结果(结果立即传递,而不是仅在下一个轮询间隔由客户端发现)。

对于纯带宽使用,详细信息将取决于具体情况。 http轮询请求必须建立TCP连接并确认该连接(如果是SSL连接则更多数据),然后它必须发送http请求,包括属于该主机的任何相关cookie,包括相关的头和获取网址。然后,服务器必须发送响应。并且,大多数情况下,所有这些轮询开销都将完全浪费带宽,因为没有什么新的报告。

webSocket以简单的http请求开始,然后将协议升级到webSocket协议。 webSocket连接本身不需要发送任何数据,直到服务器有东西发送到客户端,在这种情况下服务器只发送数据包。发送数据本身也有很少的开销。没有cookie,没有标题等......只是数据。即使你在webSocket上使用了一些keep-alives,与HTTP请求的开销相比,这些数据量也非常小。

那么,你在带宽上节省多少取决于具体情况。如果在找到任何有用数据之前需要50个轮询请求,那么与webSocket方案相比,这些http请求中的每一个都完全被浪费了。带宽的差异可能是巨大的。

您询问了只需要定期检查的应用程序。一旦定期检查导致无法检索数据,就会浪费带宽。这就是webSocket的整个想法。当没有数据要发送时,您不消耗带宽(或接近无带宽)。


9
投票

我相信@jfriend00非常清楚地回答了这个问题。但是,我确实想添加一个想法。

通过抛出Websockets与HTTP的最坏情况(也是不可能的)场景,你会清楚地看到Websocket连接总是在带宽(以及可能是全面的性能)方面具有优势。

这是Websockets v / s HTTP最糟糕的情况:

  • 您的代码使用Websocket连接的方式与使用HTTP请求完全相同,用于轮询。 (我知道,这不是你会做的事情,但这是最糟糕的情况)。
  • 每个轮询事件都得到肯定回答 - 这意味着没有任何HTTP请求被徒劳地执行。

这是Websockets最糟糕的情况,它设计用于推送数据而不是轮询... Websockets将为您节省带宽和CPU周期。

说真的,甚至忽略DNS查询(由客户端执行,因此您可能不关心它)和TCP / IP握手(对于客户端和服务器都很昂贵),Websocket连接仍然更高性能和成本 - 有效。

我会解释一下:

每个HTTP请求都包含大量数据,例如cookie和其他标头。在许多情况下,每个HTTP请求也需要进行客户端身份验证...很少会将数据发送给任何人。

这意味着每个请求HTTP连接都会传递所有这些数据(并可能执行客户端身份验证)。[无状态]

但是,Websocket连接是有状态的。数据仅发送一次(而不是每次发送请求)。客户端身份验证仅在Websocket连接协商期间发生。

这意味着Websocket连接每个连接传递一次相同的数据(并可能执行客户端身份验证)(所有轮询一次)。

因此,即使在最糟糕的情况下,轮询始终为正,并且Websockets用于轮询而不是推送数据,Websockets仍将为您的服务器节省带宽和其他资源(即CPU时间)。

我认为,简单地说,你的问题的答案是“从不”。 Websockets永远不会低于轮询效率。

© www.soinside.com 2019 - 2024. All rights reserved.