Nodejs和Socket.io能够支持多少用户?

22

我有一个实现了广播.emit功能的网站,可以将消息发送给该站点的所有用户。这只是socket.io最简单的实现方式,但目前出现了问题。当并发用户数达到约100个时,Node.js服务器开始变慢,直到挂起,导致无法访问整个网站。在检查服务器时,发现Node.js正在占用100%的CPU。这正常吗?

我想知道socket.io支持多少个用户?当发生这种情况时,有没有一种方法可以通过编程方式重新启动Node.js服务器?


2
你能告诉我们一下服务器的规格信息吗? - UpTheCreek
3个回答

20

我有一个多人卡牌游戏,Socket.io在大约3000个并发用户时会将我的CPU占满。这是在Intel i7 CPU上的情况。因此,我必须运行多个node/socket.io进程来处理负载。

对于100个并发连接,你应该没问题。也许你正在使用一些VPS,而CPU是与所有其他虚拟机共享的?你是否运行了专用服务器?

此外,请检查你的代码。你可能正在同步地执行一些本应该异步进行的操作。


如果您使用集群模块并使用更多的核心,那么这个数字会增加吗?或者您已经在使用集群模块了吗? - Ben J.
9
目前,我使用HAProxy作为前端运行7个节点进程。大约有9000个并发用户(每个节点约1300个),一切都可以在单台服务器上正常运行,没有任何问题。 - Milan Babuškov
1
感谢您的真实反馈。 - kwcto
1
@MilanBabuškov 感谢您提供实际的例子,我很好奇您是如何处理内存数据库的,因为您有7个节点进程在运行。使用Redis的发布/订阅功能吗?我即将推出一个带有WebSockets的动作RPG游戏,正在考虑是否应该重写所有内容以支持Redis,或者只用1台服务器就可以了。此外,每个用户每分钟发送多少条消息? - NiCk Newman
2
我正在对数据进行分片,并将所有信息存储在普通的JavaScript对象中。我使用HAProxy来确保同一玩家始终连接到同一台服务器。请注意,这是一款卡牌游戏(回合制),因此每个玩家每分钟发送约20-30条消息。 - Milan Babuškov

17

至少250,000个并发连接(对于大多数用例,瓶颈在于内存)


11
以上提到的250k是一种没有使用socket.io的HelloWorld类型基准测试。实际上,c10k接近真实情况(取决于您的CPU和应用程序复杂性)。例如,对于我正在运行的一款纸牌游戏,我在大约c3k时达到了100%的CPU使用率。 - Milan Babuškov
1
1百万并发连接 - http://blog.caustik.com/2012/08/19/node-js-w1m-concurrent-connections/ - Andrey Sidorov
1
“1百万并发连接” 也是不使用 socket.io 实现的。Node.js 可以很好地扩展,但我对 socket.io 感到不太确定。 - Milan Babuškov
2
大家好,更新一下。我们已经迁移到了Amazon EC2实例,现在可以处理我们目前的用户。我们目前的最大并发用户数是500,所以还不算太重。 - 3s2ng
@Jon 如果他们每60秒(或空闲)发送一次请求怎么办? - Andrey Sidorov
显示剩余8条评论

3

如果对您来说向所有客户端传递消息而不丢失它至关重要,我建议使用socket.volatile.emit调用。远程客户端和不稳定的连接可能会导致许多问题。


向客户端传递的信息非常重要,因为所有用户之间的数据应该始终保持同步更新。如果我使用 volatile 关键字,这是否意味着如果用户失去连接,他们将无法接收到消息?后续有机会接收到最新的消息吗?使用 volatile 还有其他不利因素吗? - 3s2ng
2
当当前消息数据替换客户端上一条数据时(即通过相同调用发送的先前消息被淘汰),我会使用 socket.volatile.emit - Gautham Badhrinathan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接