Web套接字在哪些方面的效率低于轮询?

Eck*_*ers 10 optimization performance polling websocket

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

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

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

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

jfr*_*d00 15

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

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

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

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

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

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

  • 维护一个开放的 WebSocket 使用了多少带宽?我假设在没有端口转发的情况下,必须偶尔将数据包从客户端发送到服务器,以便在服务器想要向客户端推送任何内容时启用 NAT 穿越。 (4认同)
  • 但是服务器资源会发生什么情况呢?每 5 秒处理一个请求不是比为每个用户永远保持连接更好吗? (4认同)
  • @Enrique - 一方面,如果客户端仅每 30 分钟轮询一次,那么 http 请求可能是正确的处理方式,但如果客户端需要服务器端更改的低延迟(例如几秒钟),那么在服务器上使用 http 轮询将比 webSocket 困难得多。http 长轮询也是一种介于两者之间的解决方案,但通常被 webSockets 取代。 (3认同)
  • @Eckster-NAT实现对不活动的TCP连接的处理方式会有所不同。webSockets可以选择发送ping / pong数据包。它们是非常小的数据包(以字节为单位,在我看来,它是2个字节的实际数据加上任何TCP开销),因此这不太可能对整体带宽使用造成很大的影响。保持活动状态可能仅在处理能力方面显示出更多,在此情况下,与服务器成千上万的webSocket连接,每个连接都有偶尔的ping / pong。 (2认同)
  • @Enrique - 空闲套接字不会占用大量服务器资源 - 实际上只是系统内存。如今,经过适当定制的服务器可以配置为处理一百万个并发套接字。如果您在 webSockets 和 http 轮询之间做出决定,您真的必须将使用场景放在一起,以了解同时存在的客户端数量和可接受的轮询间隔以及客户端实际有新数据的频率,然后您可以开始建模哪个会更有效率。魔鬼在细节中。 (2认同)

Mys*_*yst 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永远不会低于轮询效率.