【问题标题】:Working with WebSockets and NodeJs clusters使用 WebSockets 和 NodeJs 集群
【发布时间】:2021-01-10 06:41:30
【问题描述】:
我目前有一个运行在 MongoDB 上的 Node 服务器。它处理一些 HTTP 请求,但主要使用 WebSockets。基本上,服务器使用 WebSocket 将多个用户连接到房间。
我的服务器目前打开了大约 12k 个 WebSocket,它几乎使我的单线程服务器瘫痪,现在我不知道如何转换它。
服务器保存已连接用户和房间的 HashMap 变量。当用户执行操作时,服务器通常会引用那些 HashMap 变量。所以,我不确定如何在其中使用集群。我想可能会为每个 WebSocket 消息创建一个线程,但我不确定这是否是正确的方法,并且它无法为其他用户访问 HashMaps
有没有人知道该怎么做?
谢谢。
【问题讨论】:
标签:
node.js
multithreading
performance
websocket
【解决方案1】:
您可以查看 socket.io-redis 适配器以获得架构想法,或者您可以决定使用 socket.io 和 redis 适配器。
他们将您的 hashmap 等价物移动到一个单独的进程 redis 内存数据库,以便所有集群进程都可以访问它。
socket.io-redis 适配器还支持更高级别的功能,因此您可以通过一次调用向房间中的每个套接字发出信号,并且适配器会找到房间中每个套接字的连接位置,联系特定的集群服务器并拥有它将消息发送给他们。
我想可能会为每个 WebSocket 消息创建一个线程,但我不确定这是否是正确的方法,并且它无法为其他用户访问 HashMaps
node.js 中的线程不是轻量级的东西(每个都有自己的 V8 实例),因此您不会希望每个 webSocket 连接都有一个 nodejs 线程。您可以在一个 webWorker 上对一定数量的 webSocket 连接进行分组,但此时,使用集群可能更容易,因为 nodejs 会自动为您处理跨集群的分布,而您必须自己为自己的 webWorker 执行此操作游泳池。