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

标签 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) 开始发送数据时,就会出现问题。服务器最初工作正常,但几分钟后它停止响应。即使服务器没有响应,客户端也会保持连接。请求堆积如山。有时服务器会收到最后的 session 请求。

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

P.S. 这里我认为“事件”是——

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

编辑2

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

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

我的服务器目前在 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 服务器可以拥有多少个事件处理程序,还是在询问一个 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,但您必须首先通过测试确定这一点。

关于javascript - socket.io 可以处理多少事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53323371/

相关文章:

javascript - AJAX onreadystatechange 在状态更改后执行?

node.js - 采用 RESTful 架构的长轮询(用户通知)

javascript - 如何使用 JayData 自定义 OData 服务器?

javascript - meteor 模板中的简单数据反射

MongoDB 递归查找查询

mongodb - MongoDB 中删除了多少文档

javascript - 如何获取 PhantomJS 中的当前脚本名称?

javascript - 删除 Firefox 星形图标和书签图标

javascript - 如何在 JavaScript 中对字符串进行排序

node.js - Socket.io 客户端未连接