NodeJs集群与Socket.IO和命名空间



我正在构建一个浏览器主页。原型已经完成,现在我正在考虑如何扩展和托管它;游戏服务器";,其当前处理一个游戏会话。一个游戏会话包括一个最多可连接8名玩家的socketio连接。

我想使用例如节点集群来具有多个"节点";游戏服务器";在同一个docker容器中,每个游戏服务器都应该处理一个或多个游戏会话,这样cpu的所有核心都可以使用。一个游戏会话仅由8名玩家使用,并且游戏会话应该相互隔离。

据我所知,Node Cluster使我能够让所有子流程共享同一个端口。我想为每个游戏会话都有一个名称空间(例如,玩家无论如何都要连接到的浏览器中的ID(。目标是:你得到一个URL,你发送给朋友以邀请他,类似于例如skribble.io-https://localhost/?gameid=1234)。所以在我的例子中,加入一个名称空间基本上和加入一个游戏是一样的。

我的目标是拥有多个这样的docker容器,并使用反向代理将传入的连接路由到url中指定的正确容器,该容器处理游戏。但这里的问题是,我不知道如何将连接转发到集群的正确子进程。

所以最后应该是这样的:

GameServerMaster [Maps ids to processes like: [ClusterNode1:[id1,id2,..]}
- GameServerClusterNode1
- GameSession1 [id1 io.off("/id1")]
- GameSession2 [id2 io.off("/id2)]
- ....
- GameServerClusterNode2
- GameSession3 [id3 io.off("/id3")]
- GameSession4 [id4 io.off("/id4)]
- ....

我找到了socket.io-redis,但这似乎有点过于强大,因为没有广播——每场比赛都是孤立的。(而且我不想仅仅为了这个用例而托管redis(

此外,我发现了粘性会话,但通过使用它,我不知道如何将传入的连接转发到正确的进程,我认为它只是负载平衡它们,这很糟糕,因为它必须路由到实际处理请求的游戏会话的进程-但我认为我无论如何都需要这样的东西,还是我需要?

我正在做的(或计划做的(是正确的方法吗?你对技术或架构有什么建议吗?

丢弃整个集群部分,只让docker容器处理一个"集群"会更好吗;节点";,处理这些多个游戏会话?

我发现自己也处于同样的情况,于是我提出了以下解决方案。

理念:

您在不同的端口上用集群模块派生新进程。有了主进程,你就像一个路由器。

示例:

在玩家加入房间之前,他问路由器,(广播(123号房间在哪里。路由器询问他的子流程其中哪个托管房间123,并转发结果(例如端口3001(到客户端。然后客户端连接到确切的进程

问题:

如果多个子流程具有相同的roomId,则会发生冲突,但我想你会想办法避免这种情况的,即使这种情况发生的可能性很低

需要注意的是,此解决方案是使用机器的所有核心,而不是分发到多台机器的解决方案。

如果你想将其分发到多台机器上,你应该重新考虑将Redis作为你的首选。

最新更新