node.js - 使用 WebSocket 是否有服务器成本?

标签 node.js websocket comet

我一直在远离 PHP/MySQL 的舒适区,因为语法/封装/过程的东西可能会令人沮丧。

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

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

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

我的问题是,WebSockets 是否适用于大型应用程序?没有真正的高带宽服务器是否实用?

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

谢谢!

最佳答案

有很多很好的概述网站可供阅读,了解 websocket 的一般工作原理,例如 herehere .

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

为客户端维护一个开放的套接字会产生一些服务器开销,因此如果您预计一次会有数万个这样的套接字,则必须确保您的服务器基础架构能够达到这种规模。 CPU 负载仅与在任何给定时间有多少套接字忙成正比,因为空闲套接字不占用任何 CPU。

Is there a server cost to using WebSockets?

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

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

以下是有关该主题的其他一些引用资料:

Websockets and scalability

websocket vs rest API for real time data?

Websocket vs REST when sending data to server

Ajax vs Socket.io

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?


Comet 库尝试支持类似 WebSocket 的接口(interface),即使没有直接的 WebSocket 支持。这就是一些低效的黑客开始出现的地方,因为它试图通过保持打开的 HTTP 连接来模拟双向 TCP 套接字。如果您使用的是真正的 WebSocket,这不是问题。

关于node.js - 使用 WebSocket 是否有服务器成本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23314964/

相关文章:

javascript - MongoDB:您可以将一个集合作为字段包含在另一个集合的文档中吗?

websocket - Thrift 支持通过 websocket 发送数据吗?

ajax - IE7 Ajax 调用被最大连接数阻止

基于 C#/ASP 的反向 AJAX

http - 为什么 Comet 需要 multipart/x-mixed-replace?

node.js - aws FIFO 队列返回空队列,即使它有可用消息

node.js - 开场 Mocha 并行描述

javascript - 如何使用客户端的凭据从 Node 后端查询 firebase

python - 在 apache 中运行 Tornado

c# - 如何在与 SignalGo 套接字断开连接后自动调用登录功能