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

问题描述 投票:1回答:1

我正在为我的个人项目尝试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时,一个节点基本上是一个在单个线程上运行的进程,如果它需要处理其他东西它启动另一个节点(异步线程),只留下新线程执行它的进程并返回主线程运行。如果我们想要处理一些进程序列,我们使用“async / await”。

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

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

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

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

那么问题是什么?

javascript node.js mongodb socket.io iot
1个回答
2
投票

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

首先,目前尚不清楚你是否在讨论socket.io服务器可以拥有多少个事件处理程序,或者你是否在询问socket.io服务器可以处理多少个实时事件(如事件/秒) 。

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

一般而言,需要数千个单独编码的事件监听器的系统可能可以通过其他方式更有效地设计,但是我们必须看到更多关于您正在做什么的详细信息,以了解如何更具体地提供建议。


至于socket.io服务器可以处理多少消息/秒,这完全取决于服务器处理每条消息的操作,服务器带宽,服务器处理每条消息的速度等等。


除非你一次向你的服务器充斥数万条消息或对每条消息进行大量处理,否则我猜你的服务器困难可能与服务器代码的其他部分有关(可能是你在消息到达时所做的事情)以及你如何处理它们。

我还想知道你是否创建了某种循环消息循环,其中clientA向服务器发送msgA。服务器接收该消息,对其进行一些处理并向客户端A发送msgB。 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,但您必须首先通过测试确定。

© www.soinside.com 2019 - 2024. All rights reserved.