Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 带有Socket.IO和名称空间的NodeJs集群_Javascript_Node.js_Socket.io_Node Cluster - Fatal编程技术网

Javascript 带有Socket.IO和名称空间的NodeJs集群

Javascript 带有Socket.IO和名称空间的NodeJs集群,javascript,node.js,socket.io,node-cluster,Javascript,Node.js,Socket.io,Node Cluster,我正在制作一个浏览器游戏。原型已经完成,现在我正在考虑如何扩展和托管它。我已经有了一个“游戏服务器”,它目前处理一个游戏会话。一个游戏会话包括与8名玩家(最多)的socketio连接 例如,我希望在同一个docker容器中有多个“gameserver”,每个gameserver应处理一个或多个GameSession,以便可以使用cpu的所有核心。 一个gamesession仅由8名玩家使用,并且gamesession应彼此隔离 据我所知,节点集群使我能够让所有子进程共享同一端口。 我想为每个游戏

我正在制作一个浏览器游戏。原型已经完成,现在我正在考虑如何扩展和托管它。我已经有了一个“游戏服务器”,它目前处理一个游戏会话。一个游戏会话包括与8名玩家(最多)的socketio连接

例如,我希望在同一个docker容器中有多个“gameserver”,每个gameserver应处理一个或多个GameSession,以便可以使用cpu的所有核心。 一个gamesession仅由8名玩家使用,并且gamesession应彼此隔离

据我所知,节点集群使我能够让所有子进程共享同一端口。 我想为每个游戏会话设置一个名称空间(例如,浏览器中的一个ID,玩家可以通过任何方式连接到该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)]
     - ....
我发现了,但这似乎有点过分,因为没有广播——每一场比赛都是孤立的。(我也不想仅仅为了这个用例而托管redis)

另外,我发现,但是通过使用这个,我不知道如何将传入的连接转发到正确的进程,我认为这只是负载平衡,这是不好的,因为它必须路由到实际处理请求的游戏会话的进程-但我想我需要这样的东西,或者我需要吗

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


抛开整个集群部分,让docker容器处理一个“节点”会更好吗?

我发现自己也遇到了同样的情况,我提出了以下解决方案

想法: 您可以在不同的端口上使用集群模块派生新进程。 在主进程中,您的行为就像路由器一样

例子: 在玩家加入一个房间之前,他问路由器, (广播)123房间在哪里。路由器询问他的子进程 它们中的哪一个托管123房间,并转发结果(例如端口3001) 给客户。然后,客户端连接到确切的进程。 问题: 如果多个子流程具有相同的roomId,则会发生冲突, 但我想你会想出一个办法来避免, 即使这样,发生这种情况的可能性也很低。 需要注意的是,此解决方案使用机器的所有内核,但不是分发到多台机器的解决方案


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

谢谢您的评论。我也在考虑这一点,但我也认为,在docker容器上打开端口范围只会是糟糕的体系结构的结果,特别是当节点集群提供端口共享功能时。但我想,这可能仍然是最可靠的解决方案,因为它不需要额外的依赖关系。 Before player joins a room, he asks the router, (broadcast) where is room 123. The router asks his subprocesses which of them hosts room 123, and forwards the result (eg. port 3001) to the client. The client then connects to the exact process. If more than one subprocess has the same roomId, there will be a conflict, but I guess you will figure out a way to avoid this, even tho the probability for this to happen is very low.