【发布时间】:2019-04-18 18:53:20
【问题描述】:
我正在为我的个人项目尝试 Socket.io(服务器和客户端)。因为这是我第一次尝试使用 node.js,甚至是 javascript 和 mongodb,我对我的服务器的性能有点困惑。
我创建了一个包含许多事件和许多房间的复杂实时系统。服务器的事件非常有限,但客户端的事件太多。这些事件分布在房间下。
例如——
R1房间>> 事件 R1E1, 事件 R1E2, 事件 R1E3.... 事件 R1EN
R2房间>> 事件 R2E1, 事件 R2E2, 事件 R2E3.... 事件 R2EN
所有数据都存储在mongodb中。工作真棒。
但是,当注册了 10-15 个事件的少数客户端 (5-8) 开始发送数据时,就会出现问题。服务器最初工作正常,但几分钟后它停止响应。即使服务器没有响应,客户端也会保持连接。请求堆积如山。有时服务器会收到最后一个会话请求。
这一切都从最终设备开始注册事件开始。 所以我想知道 socket.io 可以处理多少事件?
P.S.我认为“事件”是-
io.on('event', function(msg){
console.log( msg);
});
编辑 2
当我研究 node.js 时,节点基本上是一个在单个线程上运行的进程,如果它需要处理其他事情,它会启动另一个节点(异步线程),让新线程独自完成它的进程并返回到主线程运行。如果我们想处理一些进程序列,我们使用“async/await”。
在我的情况下,当客户端第一次连接时,我只在一个地方使用异步。这里我查询了 3 个不同的 mongodb 集合,并返回一个事件的数据。
我的服务器当前在 MacBook Pro(16 GB RAM,i7 第 6 代四核)上运行。它应该处理至少 4-6 个并发线程。
我创建了一个负载测试,100000 个不同的事件分布在 1000 个房间下,每秒有 5 个请求查询数据库。它工作正常。几乎 40% 的 RAM 和 250% 的 CPU 是最大负载。
我与 db 的连接是持久的,这意味着我会在服务器启动后立即连接到 db 并保持该连接引用处于活动状态。
那么问题出在哪里?
【问题讨论】:
-
我没有给你一个明确的答案,但我认为瓶颈可能在你的事件处理的某个地方,而不是 Socket.io 本身。话虽如此,如果您希望您的应用程序增长,我将开始研究如何使用 socket.io (socket.io/docs/using-multiple-nodes/…) 设置多个节点。通过将事件处理程序放入单独的流程循环中,仅此一项可能会有所帮助。
-
在我的情况下,服务器和客户端将有许多“redis”。我已经测试了性能基准测试,它很好,当前场景只占该基准测试的一小部分。所以从技术上讲它应该可以工作。
标签: javascript node.js mongodb socket.io iot