虽然我理解上述问题的答案在某种程度上取决于您的应用程序架构,但我主要对非常简单的场景感兴趣。
基本上,如果我的应用程序每隔5秒钟进行一次ping更改或每分钟一次,那么为什么发送的数据保持打开的Web套接字连接最终会超过简单轮询所浪费的数量?
基本上,我感兴趣的是,如果应用程序不一定需要实时更新,那么通过使用像Meteor这样的框架来量化你会产生多少低效率的方法感兴趣,但只是定期检查
请注意,我的重点是带宽利用率,而不一定是数据库访问时间,因为像Meteor这样的框架具有高度优化的方法,只请求更新数据库。
答案 0 :(得分:13)
websocket连接的重点在于您不必ping应用程序以进行更改。相反,客户端只连接一次,然后服务器可以直接发送客户端更改,只要它们可用。客户永远不必问。服务器只在可用时发送数据。
对于任何类型的服务器启动数据,带宽比http轮询更有效。除了为您提供更及时的结果(结果立即传递,而不是仅在下一个轮询间隔由客户端发现)。
对于纯带宽使用,详细信息取决于具体情况。 http轮询请求必须建立TCP连接并确认该连接(如果是SSL连接,则更多数据),然后它必须发送http请求,包括属于该主机的任何相关cookie,包括相关的头和获取网址。然后,服务器必须发送响应。并且,大多数情况下,所有这些轮询开销都将完全浪费带宽,因为没有什么新内容可以报告。
webSocket以简单的http请求开始,然后将协议升级到webSocket协议。 webSocket连接本身不需要发送任何数据,直到服务器有东西发送到客户端,在这种情况下服务器只发送数据包。发送数据本身也有很少的开销。没有cookie,没有标题等......只是数据。即使你在webSocket上使用了一些keep-alives,与HTTP请求的开销相比,这些数据量也非常小。
那么,您在带宽中节省多少取决于具体情况。如果在找到任何有用数据之前需要50个轮询请求,那么与webSocket方案相比,这些http请求中的每一个都完全被浪费了。带宽的差异可能是巨大的。
您询问了只需要定期检查的应用程序。一旦定期检查导致无法检索数据,就会浪费带宽。这就是webSocket的整个想法。当没有数据要发送时,您不消耗带宽(或接近无带宽)。
答案 1 :(得分: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永远不会低于轮询效率。