Nodejs & Socket.io 可以支持多少用户?
Posted
技术标签:
【中文标题】Nodejs & Socket.io 可以支持多少用户?【英文标题】:How many users Nodejs & Socket.io can support? 【发布时间】:2012-04-27 01:19:27 【问题描述】:我有一个实现broadcast.emit 的网站。向站点的所有用户发送消息。它只是 socket.io 的最简单实现,但我目前遇到了问题。当我达到大约 100 个并发用户时。 nodejs 服务器开始滞后,直到它挂起,我无法再访问我的整个网站。当我们检查服务器时。 nodejs 占用了 100% 的 CPU。正常吗?
我想知道socket.io 可以支持多少用户?当这件事发生时,有没有办法以编程方式重新启动 nodejs 服务器?
【问题讨论】:
你能给我们一些关于服务器规格的信息吗? 【参考方案1】:我有一个多人纸牌游戏。 Socket.io 在大约 3000 个并发用户时最大限度地利用了我的 CPU。这是在英特尔 i7 CPU 上。因此,我必须运行多个 node/socket.io 进程来处理负载。
对于 100 个并发连接,您应该没问题。也许您正在使用一些 VPS 并且 CPU 与所有其他 VM 共享?您是否运行专用服务器?
另外,请检查您的代码。你可能正在同步做一些应该异步的事情。
【讨论】:
如果你使用集群模块并使用更多的核心,这个数字会增加吗?还是您已经在使用集群模块? 目前,我使用 HAProxy 作为前端运行 7 个节点进程。大约有 9000 个并发用户(每个节点约 1300 个),一切正常。全部在一台服务器上。 感谢真实世界的回应。 @MilanBabuškov 感谢现实生活中的例子,只是好奇,因为你有 7 个节点进程正在运行,你是如何处理内存数据库的?使用 redis 发布/订阅?我即将推出一个带有 websockets 的动作 RPG,并且正在考虑是否应该重写所有内容以支持 redis,或者我应该对 1 个服务器没问题。另外,每个用户每分钟发送多少条消息? 我正在对数据进行分片并将所有信息存储在纯 javascript 对象中。我使用 HAProxy 来确保同一个播放器始终连接到同一个服务器。请注意,这是一款纸牌游戏(回合制),因此每个玩家每分钟发送大约 20-30 条消息。【参考方案2】:At least 250k 并发连接(大多数用例的瓶颈是内存)
【讨论】:
谢谢安德烈。实际上服务器内存没有问题。它使用的服务器内存不到 5%。我也忘了提到 nodejs 和我的 web & db 服务器在同一个盒子里 上面提到的 250k 是没有 socket.io 的 HelloWorld 类型的基准测试。实际上 c10k 接近真实(取决于您的 CPU 和应用程序的复杂性)。例如,对于我正在运行的纸牌游戏,我在 c3k 左右达到了 100% 的 CPU 使用率。 1m 并发连接 - blog.caustik.com/2012/08/19/node-js-w1m-concurrent-connections “1m 并发连接”也没有 socket.io。 Node.js 的扩展性很好,但我对 socket.io 不太确定。 伙计们只是为了更新。我们迁移到 Amazon EC2 实例,现在可以处理我们当前的用户。我们目前的最大并发用户数是 500,所以还不算多。【参考方案3】:在不丢弃消息的情况下向所有客户端传递消息对您来说至关重要吗?如果不是,我建议使用 socket.volatile.emit 调用。远程客户端和不稳定的连接可能会出现很多问题。
【讨论】:
传递给客户的消息很重要。因为所有用户的数据应该一直同步更新。如果我要使用 volatile 是否意味着如果用户失去连接将不会收到消息?以后会有机会收到最新消息吗?使用 volatile 的任何其他缺点? 我会使用socket.volatile.emit
当当前发送的消息数据替换客户端上的先前数据(即,使通过同一调用发送的先前消息过时)。以上是关于Nodejs & Socket.io 可以支持多少用户?的主要内容,如果未能解决你的问题,请参考以下文章
继续获取和发布 /socket.io/?EIO=3&transport=polling&t=