根据条件将流量路由到多个节点服务器

Route traffic to multiple node servers based on a condition

我正在使用 nodejs 和 HTML5 编写在线多人游戏的代码,我现在想要有多个地图供人们玩,但我遇到了缩放问题.我所在的服务器 运行 本身无法支持超过几张地图的游戏循环,即使它有 4 个内核,我也只能使用一个具有单个节点进程的内核。

我希望能够扩展它,甚至不必局限于单个服务器。我希望能够为游戏中的每张地图启动一个节点进程,然后有一个主进程查找玩家所在的地图并将他们的连接传递给正确的子进程以进行处理,更新游戏信息等

我已经找到了一些方法来使用像 nginx 这样的代理或内置的节点集群来实现负载平衡,但从我所看到的例子来看,我只是给出了与下一个可用进程的连接,我需要专门发给他们。有什么方法可以让我根据这样的条件将连接路由到节点进程吗?目前,我正在使用 Express 来提供我的静态内容,并使用 socket.io 进行客户端到服务器的通信。玩家所在地图的信息将与其他玩家数据一起 MongoDB,如果有差异的话。

有很多方法可以解决您的问题,根据您的描述,这里有两个建议。

1 - 使用路由器服务器将玩家查询发送到 "Area servers" :在这个拓扑结构中,所有客户端查询都将到达您的路由服务器,服务器用唯一的 id 标记每个查询并将其发送到正确的区域服务器,区域服务器处理查询并将其发送回路由服务器,路由服务器将从唯一标记中识别它并将响应发送回客户端。

此解决方案将分派 CPU/memory 负载而不是带宽!

2 - 使用身份验证服务器将客户端重定向到负载较小的服务器:在这种情况下,您将拥有多个相同的服务器和一个身份验证服务器,当客户端进行身份验证时,发送 url 和客户端可用服务器的身份验证令牌和服务器的身份验证票证。 然后客户端连接到服务器,该服务器将使用 auth toekn/auth 票据进行识别。

此解决方案将发送所有 CPU/Memory/Bandwidth,但可能并不适合所有游戏,因为每次连接都可能被发送到不同的服务器,如果不在同一区域,您将看不到玩家在同一台服务器上。

这只是两个简单的建议,您可以混合使用这两种方法或添加其他内容(例如内部通信区域服务器等),这将解决上述问题,但会增加复杂性。