socket.io 可以处理多少个事件?

How many events can socket.io handle?

我正在为我的个人项目尝试 Socket.io(服务器和客户端)。因为这是我第一次尝试 node.js 甚至 javascript 和 mongodb 我对我的服务器的性能有点困惑。

我创建了一个包含许多事件和许多房间的复杂实时系统。服务器的事件非常有限,但客户端的事件太多。这些事件分布在房间下。

例如 -

所有数据都存储在mongodb中。工作很棒。

但是,当注册了 10-15 个事件的少数客户端 (5-8) 开始发送数据时,就会出现问题。服务器最初工作正常,但几分钟后它停止响应。即使服务器没有响应,客户端也会保持连接。请求堆积如山。有时服务器会收到最后的会话请求。

一切从最终设备开始注册事件开始。 所以我想知道一个socket.io可以处理多少个事件?

P.S.这里我认为"event"是-

io.on('event', function(msg){
    console.log( msg);
});

编辑 2

正如我对 node.js 的研究,一个节点基本上是一个在单个线程上运行的进程,如果它需要处理其他事情,它会启动另一个节点(异步线程),让新线程单独执行它是进程 return 到主线程 运行。如果我们想处理一些流程序列,我们使用 "async/await"。

在我的例子中,当客户端第一次连接时,我只在一个地方使用异步。在这里,我查询了 3 个不同的 mongodb 和 return 事件数据集合。

我的服务器目前 运行 在 MacBook pro(16 GB RAM,i7 第 6 代四核)上。它应该至少处理 4-6 个并发线程。

我创建了一个负载测试,100000 个不同的事件分布在 1000 个房间下,每秒 5 个请求查询数据库。它工作正常。几乎 40% RAM 和 250% CPU 是最大负载。

我与数据库的连接是持久的,这意味着我会在服务器启动后立即连接到数据库并保持该连接引用处于活动状态。

那么问题是什么?

So I just want to know how many events a socket.io can handle ?

首先,不清楚您是在谈论 socket.io 服务器可以拥有多少事件处理程序,还是在询问有多少实时事件(如 events/sec) socket.io 服务器可以处理。

在第一项中,socket.io 服务器可以处理的事件处理程序数量没有编码限制。套接字派生自 EventEmitter,它使用 EventEmitter 的侦听器功能来允许某人侦听事件。该基础设施没有编码限制,甚至没有实际限制,因为它是一个非常轻量级的系统。

一般来说,一个需要数千个单独编码的事件侦听器的系统可能可以通过其他方式更有效地设计,但我们必须了解您正在做的事情的更多细节才能知道如何更具体地提供建议。


至于一个socket.io服务器可以处理多少messages/sec,这完全取决于服务器处理每条消息的方式,你的服务器有多少带宽,你的服务器有多快在处理每条消息等。


除非你一次用数万条消息淹没你的服务器或者对每条消息进行大量处理,否则我猜你的服务器问题可能与服务器代码的其他部分有关(可能在你消息到达时正在做的事情以及您如何处理它们)。

我还想知道您是否创建了某种循环消息循环,其中 clientA 将 msgA 发送到服务器。服务器收到该消息,对其进行一些处理并将 msgB 发送给 clientA。 clientA 收到该消息,对其进行一些处理,该处理的一些副作用导致它再次向服务器发送 msgA,您最终可能会遇到一个永无止境的消息循环。

此外,socket.io 中的房间没有 "have events" 或 "receive events",因此您的部分描述没有意义。您可以将事件发送到房间内的所有套接字。但是,这实际上只会导致服务器遍历给定房间的所有成员,并分别向他们发送一条消息。


根据您的编辑,如果 "event" 是这样的:

io.on('event', function(msg){
    console.log( msg);
});

然后,您的服务器每秒可以处理的事件数取决于各种系统配置变量(带宽、CPU、数据库性能等...)以及您对处理每个传入事件。这是要做的事情的列表:

  1. 绝对确保除了服务器启动时之外,服务器中的任何地方都没有同步 I/O,因为这会立即破坏您同时处理大量 "in process" 事件的能力。
  2. 使处理每个事件的代码尽可能高效。如果您在每个事件上都查询数据库,这可能会将您的数据库设置为瓶颈。
  3. 设计一些测试来找出处理过程中的第一个瓶颈。
  4. 改善第一个瓶颈的性能特征。
  5. 重复冲洗、涂抹泡沫,直到您 removed/improved 前 N 个地方 运行 陷入瓶颈。

请记住,单个 node.js 实例只有一个线程,即 运行 您的 Javascript。所以,如果你希望能够处理 100 messages/sec,你可以使用不超过 10 毫秒的 CPU 来处理每条消息(1000 毫秒/秒除以 100 messages/sec = 10 毫秒/消息).如果 CPU 是您的实际瓶颈,您可以通过实施集群或启动多个进程来处理工作队列来分散到多个 CPUs,但您必须首先通过测试确定这一点。