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

时间:2018-11-15 16:02:40

标签: javascript node.js mongodb socket.io iot

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

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

例如-

  • R1房间>> 事件R1E1, 活动R1E2, 活动R1E3 ... 事件R1EN

  • R2室>> 事件R2E1, 活动R2E2, 活动R2E3 ... 事件R2EN

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

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

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

建议。在这里,我认为“事件”是-

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

编辑2

当我研究node.js时,一个节点基本上是一个在单个线程上运行的进程,如果它需要处理其他事情,它将启动另一个节点(异步线程),而让新线程独自处理并返回到主线程运行。如果要处理某些过程序列,请使用“异步/等待”。

就我而言,当客户端首次连接时,我仅在一个地方使用异步。在这里,我查询mongodb的3个不同的集合,并返回事件的数据。

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

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

我与db的连接是持久的,这意味着我会在服务器启动后立即连接到db,并保持该连接引用有效。

那是什么问题?

1 个答案:

答案 0 :(得分:2)

  

所以我只想知道socket.io可以处理多少个事件?

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

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

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


对于一个socket.io服务器每秒可以处理多少条消息,这完全取决于服务器处理每条消息的方式,服务器的带宽,服务器处理每条消息的速度等等。上。


除非您一次向服务器发送数以万计的消息,或者对每条消息进行繁重的处理,否则我想您的服务器可能与服务器代码的其他部分有关(可能与您正在执行的操作有关)邮件何时到达以及您如何处理它们)。

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

此外,socket.io中的房间不会“发生事件”或“接收事件”,因此您的描述中的一部分实际上没有任何意义。您可以将事件发送到房间内的所有插槽。但是,这实际上只会导致服务器循环遍历给定房间的所有成员,并分别向他们发送一条消息。


根据您的修改,如果“事件”是这样:

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

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

  1. 请务必确保在服务器启动时(服务器启动时除外)在服务器中的任何位置都没有同步I / O,因为这将立即破坏您同时进行多个“处理中”事件的能力。
  2. 使处理每个事件的代码尽可能高效。如果您要在每次事件中查询数据库,那么很可能会将数据库设置为瓶颈。
  3. 设计一些测试以找出处理的第一个瓶颈在哪里。
  4. 改善第一个瓶颈的性能特征。
  5. 冲洗,然后重复泡沫,直到您删除/改善了遇到瓶颈的前N个地方。

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