我已经离开了PHP / MySQL中的舒适区域,因为语法/封装/程序化的东西会令人沮丧。
上周,我开始玩游戏,并遵循一些教程,使用Node.js / Socket.IO创建实时聊天应用程序。到目前为止,我从未对WebSockets做过任何事情,而且看起来真的很酷 - 服务器和客户端之间的即时通信非常棒。
现在,请原谅我在这里缺乏理解,但是设置了HTTP,这样你就不应该能够在客户端和服务器之间保持连接 - 而且我对Comet的基本理解是它强制连接到永远不会终止写入流并只发送NUL字节。这听起来......服务器密集。
WebSockets如何工作呢?如果我一次在我的聊天应用程序上有几百人,服务器不会超载吗?当我在服务器上使用PHP / MySQL时,服务器一次只处理一个请求 - 如果我每隔一秒钟使用AJAX并进行一次轮询,我想它会快速升级,因为你有数千个请求一分钟。
我的问题是,WebSockets是否适用于大型应用程序?没有真正高带宽的服务器是否实用?
我想它归结为:在频繁间隔的AJAX轮询,Comet和WebSockets之间是否存在显着的服务器负载/用户体验差异?
谢谢!
答案 0 :(得分:25)
有很多很好的概述网站可以阅读有关websockets通常如here和here的工作原理。
简而言之,他们发起与某种类型的HTTP请求的连接,然后,它们是客户端和服务器之间的直接TCP双向连接。
维护一个打开的套接字到客户端有一些服务器开销,所以如果你一次预测成千上万的这些,你必须确保你的服务器基础设施能够达到这个规模。 CPU负载只与任何给定时间的插槽忙碌数成正比,因为空闲插槽不占用任何CPU。
使用WebSockets是否需要服务器成本?
这实际上取决于你将它与之比较。当服务器需要能够在数据可用时将数据发送到客户端时(通常称为"服务器推送"),通常使用webSockets。使用连续连接的webSocket的常用方法是让客户端重复轮询,反复询问服务器服务器是否有新内容。如果将webSocket与重复的客户端轮询进行比较,那么webSocket通常会更有效率,并且您可以使用webSockets比使用频繁轮询客户端更高的服务器扩展服务器。
可以正确配置服务器以支持数十万个同时(并且主要是空闲)的webSocket连接,这样服务器可扩展性限制就会受到您向所有这些连接的客户端发送的流量的限制。如果您每隔几秒钟向客户端发送数据并且您拥有数十万个连接的客户端,那么使用任何技术都需要大量的服务器功能(和带宽),而WebSocket仍然可能会更好比任何竞争技术。但是,如果webSocket连接的客户端大部分都处于空闲状态,并且偶尔会将数据发送给它们,那么webSocket实现可以非常有效地扩展。
以下是有关该主题的其他一些参考资料:
websocket vs rest API for real time data?
Websocket vs REST when sending data to server
Why to use websocket and what is the advantage of using it?
HTML5 WebSocket: A Quantum Leap in Scalability for the Web
Push notification | is websocket mandatory?
即使没有直接的WebSocket支持,Comet库也会尝试支持类似WebSocket的接口。这是一些效率低下的黑客开始出现的地方,因为它试图通过保持开放的HTTP连接来模拟双向TCP套接字。如果您使用的是真正的WebSockets,这不是问题。
答案 1 :(得分:7)
考虑到带宽,websockets应该比使用Comet或AJAX长轮询的所有变通方法更好或至少不会差。 websocket协议允许您只在需要时发送数据,并且只对您发送的每条消息应用最小填充(8 - 14字节,加上强制性TCP和IP成帧)。
每个活动客户端都打开一个单独的连接是正确的。因此,当您拥有大量(数千个)并发客户端时,您可能会达到Web服务器,框架或操作系统的连接限制,但这些限制通常是可配置的。
答案 2 :(得分:3)
开始学习WebSockets及其工作原理的好地方是here。 WebSocket连接"从不"终止,除非出现意外的网络问题或客户端或服务器明确决定终止连接。
Node.js可以处理很多打开的连接(前提是你的操作系统开放文件描述符设置足够高),所以通常一个系统/线程可以让你走得很远。但是,如果您需要扩展超过一个线程,您可以始终使用'群集'如果一个系统不够,则在多个系统之间进行模块和/或负载平衡。
如果有的话,WebSockets的开销可能会减少,因为您不会像长轮询或类似解决方案那样创建和拆除连接。