【问题标题】:Is there a server cost to using WebSockets?使用 WebSocket 是否有服务器成本?
【发布时间】:2014-06-12 10:58:44
【问题描述】:

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

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

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

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

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

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

谢谢!

【问题讨论】:

    标签: node.js websocket comet


    【解决方案1】:

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

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

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

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

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

    可以正确配置服务器以支持数十万个同时(并且大部分是空闲的)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 的接口,即使没有直接的 WebSocket 支持。这就是一些低效的黑客开始出现的地方,因为它试图通过保持打开的 HTTP 连接来模拟双向 TCP 套接字。如果您使用的是真正的 WebSocket,这不是问题。

    【讨论】:

    • 每个人都有很好的答案,但我必须让你的答案成为我最喜欢的解决 Comet 以及 Treehouse 链接,这是一个很好的概述。我尝试用谷歌搜索这些东西,但我认为我什至不知道关键字。谢谢!
    • 更新了答案,对服务器可伸缩性问题进行了更多讨论,并添加了有关该主题的许多其他参考。
    【解决方案2】:

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

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

    如果有的话,使用 WebSockets 的开销可能会更少,因为您不会像使用长轮询或类似解决方案那样创建和拆除连接。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-14
        • 2014-06-20
        • 2013-02-01
        • 2012-03-06
        • 1970-01-01
        相关资源
        最近更新 更多