Node.js 使用WebSocket是否需要服务器成本?

Node.js 使用WebSocket是否需要服务器成本?,node.js,websocket,comet,Node.js,Websocket,Comet,我已经离开了PHP/MySQL的舒适区,因为语法/封装/过程性的东西可能会让人沮丧 上周,我开始玩游戏,并按照一些教程使用Node.js/Socket.IO创建一个实时聊天应用程序。到目前为止,我还没有用WebSocket做过任何事情,它们看起来非常酷——服务器和客户端之间的即时通信非常棒 现在,请原谅我在这里缺乏理解,但是HTTP的设置是为了让客户端和服务器之间的连接保持打开状态——我对Comet的基本理解是,它通过从不终止写入流而只发送NUL字节来强制连接保持打开状态。这听起来。。。服务器密

我已经离开了PHP/MySQL的舒适区,因为语法/封装/过程性的东西可能会让人沮丧

上周,我开始玩游戏,并按照一些教程使用Node.js/Socket.IO创建一个实时聊天应用程序。到目前为止,我还没有用WebSocket做过任何事情,它们看起来非常酷——服务器和客户端之间的即时通信非常棒

现在,请原谅我在这里缺乏理解,但是HTTP的设置是为了让客户端和服务器之间的连接保持打开状态——我对Comet的基本理解是,它通过从不终止写入流而只发送NUL字节来强制连接保持打开状态。这听起来。。。服务器密集型

那么WebSocket是如何工作的呢?如果我的聊天应用程序上同时有几百人,服务器不会过载吗?当我在服务器上使用PHP/MySQL时,服务器一次只处理一个请求——如果我使用AJAX和轮询,比如说每隔一秒钟,我想它会迅速升级,因为一分钟会有数千个请求

我的问题是,WebSocket是否可以扩展到大型应用程序?没有真正的高带宽服务器是否可行

我想可以归结为:频繁间隔的AJAX轮询、Comet和WebSocket之间是否存在显著的服务器负载/用户体验差异


谢谢

关于WebSocket通常是如何工作的,有很多好的概述网站可以阅读

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

维护客户机的开放式套接字需要一些服务器开销,因此,如果您预期同时会有上万个这样的套接字,那么您必须确保您的服务器基础结构能够达到这样的规模。CPU负载将只与在任何给定时间有多少插槽处于繁忙状态成正比,因为空闲插槽不占用任何CPU

使用WebSocket是否需要服务器成本

这真的取决于你将它与什么进行比较。当数据可用时,服务器需要能够向客户端发送数据时,通常使用WebSocket(通常称为“服务器推送”)。使用连续连接的webSocket的通常替代方法是让客户端反复轮询,反复询问服务器是否有任何新内容。如果您将webSocket与重复的客户端轮询进行比较,那么webSocket通常是非常非常高效的,并且使用webSocket可以比使用频繁轮询的客户端更高地扩展服务器

服务器可以正确配置为支持数十万个同时(大部分是空闲)的webSocket连接,这样服务器的可伸缩性限制就受到发送到所有这些连接的客户端的流量的限制。如果你每隔几秒钟就向一个客户端发送一次数据,并且你有几十万个已连接的客户端,那么使用任何技术都需要大量的服务器马力(和带宽),而WebSocket仍然可能比任何竞争技术都要好。但是,如果与webSocket连接的客户端大部分都是空闲的,并且数据只是偶尔发送给它们,那么webSocket实现可以进行大规模高效扩展

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



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

考虑到带宽,WebSockets应该比Comet或AJAX长轮询的所有解决方案更好,或者至少不会太差。websocket协议只允许在需要时发送数据,并且只对发送的每条消息应用最小的填充(8-14字节,加上强制的TCP和IP帧)


每个活动客户端都将打开一个单独的连接,这是正确的。因此,当您同时拥有大量(数千)个客户端时,您可能会遇到Web服务器、框架或操作系统的连接限制,但这些限制通常是可配置的。

这是开始学习WebSocket及其工作原理的好地方。WebSocket连接“永不”终止,除非出现意外网络问题或客户端或服务器明确决定终止连接

Node.js可以处理大量打开的连接(前提是操作系统打开的文件描述符设置足够高),因此通常一个系统/线程就可以让您走得很远。但是,如果需要扩展到一个线程之外,如果一个系统不够,则始终可以使用“集群”模块和/或多个系统之间的负载平衡


如果说有什么区别的话,WebSocket的开销会更少,因为您不会像长轮询或类似的解决方案那样创建和删除连接。

每个人都有很好的答案,但我也必须让您的答案成为我最喜欢的Comet地址和Treehouse链接,这是一个很好的概述。我试着在谷歌上搜索这些东西,但我想我甚至还不知道这些关键词。谢谢通过对服务器可伸缩性问题的更多讨论更新了答案,并添加了许多关于该主题的其他参考。