node.js多人游戏服务器架构

jam*_*mes 3 architecture node.js

假设您正在制作德州扑克服务器.我们有一个大堂和多个房间,在这些房间里进行游戏.你在什么级别分开房间?

最初我以为我会为大厅里的每个房间生成一个节点实例.主要的好处是,如果游戏崩溃,它肯定会孤立地这样做.

当我意识到聊天服务器通常作为管理多个房间的单个守护进程运行时,我对这种方法失去了信心.对于大堂的每个房间都需要一个单独的监听端口似乎很难看.我认为跨房间管理身份也变得更容易 - 例如,如果玩家改名.

有什么想法吗?"多路复用"单个节点服务器来管理多个游戏室会话是否有意义?

ins*_*ode 5

从技术上讲,您不需要监听每个房间的分离端口.这是可能的,因为OS支持父进程和子进程共享相同的套接字(文件)描述符.您可以使用WebWorker节点模块来实现此目的.使用此体系结构,您可以自动获得负载平衡模块,该模块可以使用OS进程调度程序将传入连接分发到不同的子进程.

但是,对于您的系统,最难的部分是如何在这些进程之间共享公共数据,因为它们有自己的内存空间.幸运的是,有一些方法可以分享这些数据(在线会议,会议室,评分表...),但它们可能非常复杂.一种方法是让子进程通过IPC(套接字)与主进程通信,另一种方法是使用每个人都可以即时访问的共享内存区域(数据库,memcached ......).

我建议您首先使用单节点流程架构构建系统(如果您要使用websocket,您可以处理大量并发连接),那么当您需要扩展系统时,请使用webworker架构.此外,如果您已经使用通用位置存储/检索数据(数据库,memcached,redis密钥库...),则迁移不会花费太多时间.