我目前有一个与 MongoDB 一起运行的 Node 服务器。它处理一些 HTTP 请求,但主要使用 WebSockets。基本上,服务器使用 WebSockets 将多个用户连接到房间。
我的服务器目前打开了大约 12k 个 WebSockets,它几乎瘫痪了我的单线程服务器,现在我不确定如何转换它。
服务器为连接的用户和房间保存 HashMap 变量。当用户执行操作时,服务器通常会引用那些 HashMap 变量。所以,我不确定如何在这使用集群。我想可能会为每个 WebSocket 消息创建一个线程,但我不确定这是否是正确的方法,并且它无法访问其他用户的 HashMaps
有没有人对该怎么做有任何想法?
谢谢你。
最佳答案
您可以查看 socket.io-redis 适配器以了解架构思想,或者您可以决定使用 socket.io 和 redis 适配器。
他们将相当于你的 hashmap 移动到一个单独的进程 redis 内存数据库,以便所有集群进程都可以访问它。
socket.io-redis 适配器还支持更高级别的功能,因此您可以通过一次调用向房间中的每个套接字发出信号,适配器会找到房间中每个套接字的连接位置,联系该特定集群服务器并让它发送消息给他们。
I thought maybe creating a thread for every WebSocket message, but I'm not sure if this is the right approach, and it would not be able to access the HashMaps for the other users
node.js 中的线程不是轻量级的东西(每个线程都有自己的 V8 实例),因此您不会希望每个 webSocket 连接都有一个 nodejs 线程。您可以在 webWorker 上对一定数量的 webSocket 连接进行分组,但此时,使用集群可能更容易,因为 nodejs 会自动为您处理跨集群的分布,而您必须自己为自己的 webWorker 执行此操作水池。
关于node.js - 使用 WebSockets 和 NodeJs 集群,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64038526/