我正在使用nodejs和HTML5对在线多人游戏进行编码,而我正希望有多个地图供人们使用,但我有一个缩放问题。我正在运行它的服务器本身不能支持多个映射的游戏循环,即使它有4个核心,我也只能使用一个单节点进程。
我希望能够将其扩展到甚至不一定限于单个服务器。我希望能够为游戏中的每个地图启动一个节点进程,然后有一个主进程查找一个玩家所在的地图,并将他们的连接传递给正确的子进程进行处理,更新游戏信息等等。
我找到了一些方法来使用像nginx或内置节点集群这样的代理来实现负载平衡,但是从我所看到的示例中我看到的只是给出了下一个可用进程的连接,并且我需要特别提出来。有没有办法让我根据这样的条件将连接路由到节点进程?我正在使用Express来为我的静态内容和socket.io服务,以便客户端与服务器通信。播放器所在地图的信息将与MongoDB以及其他播放器数据一起显示,如果这样做有所不同。
答案 0 :(得分:2)
有很多方法可以解决您的问题,以下是根据您的描述提出的两条建议。
1 - 使用路由器服务器,将服务器查询分配给区域服务器" :在此拓扑中,所有客户端查询将到达您的路由服务器,服务器标记每个具有唯一ID的查询并将其分派到正确的区域服务器,区域服务器处理查询并发送回路由服务器,该服务器将从唯一标记并将响应发送回客户端。
此解决方案将调度CPU /内存负载,但不会调度带宽!
2 - 使用其客户端重定向到服务器具有较少负载的认证服务器:在这种情况下,' 11存在多个相同的服务器和一个认证服务器,当客户端进行身份验证,发送URL和的身份验证令牌客户端的可用服务器和服务器的身份验证票证。 然后客户端连接到将使用auth toekn / auth票证识别的服务器。
此解决方案将调度所有CPU /内存/带宽,但可能不适合所有游戏,因为您可以将每个连接发送到不同的服务器,如果您不是,则不会在同一区域中看到玩家在同一台服务器上。
这些只是两个简单的建议,你可以混合两种方法或添加其他东西(例如互通区域服务器等),这将解决所需的问题,但会增加复杂性。