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

问题描述 投票:19回答:3

我已经离开了PHP / MySQL中的舒适区域,因为语法/封装/程序化的东西会令人沮丧。

上周,我开始玩并参与一些教程,使用Node.js / Socket.IO创建实时聊天应用程序。 到目前为止,我从未对WebSockets做过任何事情,而且看起来真的很酷 - 服务器和客户端之间的即时通信非常棒。

现在,请原谅我在这里缺乏理解,但是设置了HTTP,这样你就不应该能够在客户端和服务器之间保持连接 - 而且我对Comet的基本理解是它强制连接保持打开状态永远不会终止写入流并只发送NUL字节。 这听起来......服务器密集。

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

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

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

谢谢!

node.js websocket comet
3个回答
26
投票

有很多很好的概述网站可以阅读有关websockets通常如何在这里这里工作的内容

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

维护一个打开的套接字到客户端有一些服务器开销,所以如果你一次预测成千上万的这些,你必须确保你的服务器基础设施能够达到这个规模。 由于空闲套接字不占用任何CPU,因此CPU负载仅与任何给定时间的套接字繁忙程度成正比。

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

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

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

以下是关于该主题的一些其他参考:

Websockets和可伸缩性

websocket vs rest API用于实时数据?

将数据发送到服务器时Websocket与REST

Ajax vs Socket.io

为什么要使用websocket,使用它有什么好处?

HTML5 WebSocket:Web可扩展性的量子跃进

推送通知| websocket是强制性的吗?


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


7
投票

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

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


3
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.