使用WebSockets是否会有服务器成本?

52

我一直在摆脱PHP/MySQL舒适区的原因是语法/封装/过程化的东西会让人感到沮丧。

上周,我开始玩耍并跟随一些教程使用Node.js / Socket.IO创建实时聊天应用程序。直到这一点,我从未做过任何与WebSockets相关的事情,它们看起来真的很酷--服务器和客户端之间的即时通信非常棒。

现在,请原谅我的理解不足,但HTTP被设置为不应该能够保持客户端和服务器之间的连接-而我对Comet的初步了解是通过永远不终止写入流并仅发送NUL字节来强制连接保持开放。这听起来...对服务器要求很高。

那么WebSockets如何工作呢?如果我的聊天应用同时有几百人参与,服务器不会负载过重吗?当我在服务器上使用PHP / MySQL时,服务器仅处理一个请求,如果我使用AJAX并轮询,例如每一秒钟,我想象它会很快升级,因为您将每分钟有成千上万个请求。

我的问题是,WebSockets是否可扩展到大型应用程序?没有一个真正高带宽的服务器是不是就没法实现呢?

我想问题归结为:在AJAX轮询,Comet和WebSockets之间,是否存在显着的服务器负载/用户体验差异?

谢谢!

3个回答

76

有很多关于WebSocket的概述网站,比如这里这里

简而言之,它们通过某种类型的HTTP请求启动连接,然后在此之后,它们是客户端和服务器之间的直接TCP双向连接。

对于维护与客户端的开放套接字,服务器存在一些开销。因此,如果您预计同时会有成千上万个这样的连接,则必须确保您的服务器基础架构能够承受该规模。CPU负载仅与任何给定时间内繁忙的套接字数量成比例,因为空闲套接字不会占用任何CPU。

使用WebSockets是否需要服务器成本?

这实际上取决于您要进行比较的对象。当服务器需要在数据可用时将数据发送到客户端时(通常称为“服务器推送”),通常会使用webSockets。使用持续连接的WebSocket的常见替代方法是让客户端重复轮询,不断询问服务器是否有任何新内容。如果将WebSocket与重复客户端轮询进行比较,则WebSocket通常更加高效,使用WebSocket比使用频繁轮询客户端可以更高效地扩展服务器容量。

服务器可以正确配置以支持数十万个同时(且大多数空闲)的WebSocket连接,从而服务器可扩展性极限仅受限于向所有这些已连接客户端发送的流量大小。如果您每隔几秒钟向客户端发送一次数据,并且您有成千上万个连接的客户端,则需要大量的服务器计算能力(和带宽)才能使用任何技术实现该目标, 但WebSocket连接的客户端大都处于空闲状态,只是偶尔接收到数据,那么WebSocket实现可以高效地扩展。

以下是该主题的其他参考资料:

Websockets和可扩展性

websocket和REST API的实时数据对比?

发送数据到服务器时websocket vs REST哪个更好?

Ajax vs Socket.io

为什么要使用Websocket,使用它有什么优点?

HTML5 WebSocket:Web可扩展性的重大飞跃

推送通知|是否必须使用WebSocket?


Comet库试图支持类似于WebSocket的接口,即使没有直接的WebSocket支持。当它尝试通过保持一个开放的HTTP连接来模拟双向TCP套接字时,一些效率低下的hack开始出现。如果您正在使用真正的WebSocket,则这不是问题。


4
大家都给出了很好的答案,但我必须选择你的答案作为我的最爱,因为它不仅解答了Comet的问题,而且提供了Treehouse链接,这是一个很好的概述。我尝试通过谷歌搜索相关内容,但我可能还不知道正确的关键词。谢谢! - M Miller
已更新答案,并对服务器可扩展性问题进行了更详细的讨论,并添加了关于该主题的其他参考资料。 - jfriend00

10

考虑到带宽,WebSockets应该比使用Comet或AJAX长轮询的所有解决方法更好,或者至少不会明显变差。 WebSocket协议允许您仅在需要时发送数据,并且仅对您发送的每条消息应用最小的填充(8-14字节,再加上义务TCP和IP框架)。

确实,每个活动客户端将具有单独的连接开启。因此,当您有大量(成千上万)的同时客户端时,可能会达到您的Web服务器,框架或操作系统的连接限制,但这些限制通常是可配置的。


6
一个学习WebSocket及其工作原理的好地方在这里here。WebSocket连接“永远”不会终止,除非出现意外的网络问题或客户端或服务器明确决定结束连接。
Node.js可以处理很多开放式连接(前提是您的操作系统打开文件描述符设置足够高),因此通常单个系统/线程就可以为您提供足够的支持。但是,如果您需要扩展到一个以上的线程,则可以始终使用'cluster'模块和/或在多个系统之间进行负载平衡,以便一个系统无法满足您的需求。
如果有什么不同,那么WebSocket的开销可能会更少,因为您不需要像长轮询或类似解决方案一样创建并拆除连接。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接