2011-05-29 165 views
2

假设您制作的是德州扑克游戏服务器。我们有一个大厅和多个房间,其中有游戏会议。你在什么水平分开房间?node.js多人游戏服务器架构

最初我以为我会为大厅中的每个房间产生一个节点实例。主要的好处是,如果游戏崩溃,它肯定会孤立地进行。

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

有什么想法? “复用”单个节点服务器以管理多个游戏室会话是否有意义?

+0

我将有一台服务器管理所有的事情,个人。我会让每个人进入一个路径,比如/ rooms/123,然后用相同的代码处理所有的请求。你打算如何计划一场游戏崩溃?这对你来说是什么样子?这是什么? – jcolebrand 2011-05-29 08:09:20

回答

5

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

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

我建议您先使用单节点流程架构来构建您的系统(如果您打算使用websocket,您可以处理大量并发连接),那么当您需要扩展系统时,请使用webworker体系结构。此外,如果您已经使用普通的地方来存储/检索数据(数据库,memcached,redis密钥库......),则迁移时间不会很长。

0

我会为您的应用推荐Hook.io。它是让多节点进程通过事件进行通信的框架。