使用WebSockets和NodeJs集群工作

4

我当前运行一个与MongoDB配合的Node服务器,它处理一些HTTP请求,但主要使用WebSockets。基本上,该服务器使用WebSockets将多个用户连接到房间。

我的服务器目前有约12,000个打开的WebSockets,几乎使我的单线程服务器无法承受,现在我不知道如何转换它。

服务器保存了已连接用户和房间的HashMap变量。当用户执行某个操作时,服务器经常引用这些HashMap变量。因此,我不确定如何使用集群。我曾考虑为每个WebSocket消息创建一个线程,但我不确定这是否是正确的方法,并且它将无法访问其他用户的HashMaps。

是否有任何想法可以解决这个问题?

谢谢。

1个回答

4

您可以查看socket.io-redis适配器以获取架构想法,或者您可以决定使用socket.io和Redis适配器。

他们将您的哈希表等价物移动到单独的进程Redis内存数据库中,以便所有集群处理进程都可以访问它。

socket.io-redis适配器还支持更高级的功能,因此您可以使用一个调用向房间中的每个套接字发出消息,然后适配器会找到这个房间中每个连接的位置,联系特定的集群服务器,并要求其向它们发送消息。

我认为可能需要为每个WebSocket消息创建一个线程,但我不确定这是否是正确的方法,而且无法访问其他用户的HashMaps

在node.js中,线程不是轻量级的东西(每个线程都有自己的V8实例),因此您不会想为每个WebSocket连接使用一个nodejs线程。您可以将一定数量的WebSocket连接组合到一个Web Worker中,但到了那个时候,使用集群可能更容易,因为Node.js将自动为您处理跨集群的分发,而对于自己的Web Worker池,您必须自己处理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接