虽然我理解上述问题的答案在很大程度上取决于您应用程序的架构,但我主要对非常简单的场景感兴趣。
如果我的应用程序每5秒或每分钟ping一次以获取更改,那么维护打开的Web Sockets连接发送的数据何时会超过通过简单轮询浪费的量?
基本上,我想知道是否有一种方法可以量化使用像Meteor这样的框架所产生的低效率,如果一个应用程序不一定需要实时更新,而只需要定期检查。
请注意,我的重点在带宽利用方面,而不是数据库访问时间,因为像Meteor这样的框架具有高度优化的方法,只请求数据库的更新。
虽然我理解上述问题的答案在很大程度上取决于您应用程序的架构,但我主要对非常简单的场景感兴趣。
如果我的应用程序每5秒或每分钟ping一次以获取更改,那么维护打开的Web Sockets连接发送的数据何时会超过通过简单轮询浪费的量?
基本上,我想知道是否有一种方法可以量化使用像Meteor这样的框架所产生的低效率,如果一个应用程序不一定需要实时更新,而只需要定期检查。
请注意,我的重点在带宽利用方面,而不是数据库访问时间,因为像Meteor这样的框架具有高度优化的方法,只请求数据库的更新。
我认为 @jfriend00 已经非常清楚地回答了这个问题。不过,我想补充一些想法。
通过插入 Websockets 对比 HTTP 的最坏情况(虽然不太可能),你会清楚地看到 Websocket 连接在带宽方面(以及可能的整体性能方面)始终具有优势。
这是 Websockets v/s HTTP 的最坏情况:
你的代码使用 Websocket 连接完全相同的方式来进行轮询请求。
(我知道这不是你会做的事情,但这是最坏的情况)。
每个轮询事件都得到了正面回答 - 意味着没有浪费任何 HTTP 请求。
这是 Websockets 的最坏情况,它们被设计用于推送数据而不是轮询...即使在这种情况下,Websockets 仍将节省您带宽和 CPU 循环。
说真的,即使忽略 DNS 查询(由客户端执行,因此您可能不关心它)和 TCP/IP 握手(对客户端和服务器都很昂贵),Websocket 连接仍然更具性能和成本效益。
我来解释一下:
每个 HTTP 请求都包含大量数据,例如 cookie 和其他标头。在许多情况下,每个 HTTP 请求还需要进行客户端身份验证...很少有数据会被随意赠送。
这意味着 HTTP 连接需要通过所有这些数据(可能还进行客户端身份验证)每次请求。[无状态]
然而,Websocket 连接是有状态的。数据只发送一次(而不是每次请求时都发送)。客户端身份验证仅在 Websocket 连接协商期间进行。
这意味着 Websocket 连接仅需要通过相同的数据(可能还进行客户端身份验证)每个连接一次(所有轮询只需要一次)。
因此,即使在这种最坏的情况下,轮询总是正面回答且 Websockets 用于轮询而不是推送数据,Websockets 仍将节省服务器的带宽和其他资源(即 CPU 时间)。
简单来说,我的答案是“永远不会”。Websockets 永远不会比轮询方式更低效。