Socket.io & Redis - io 游戏的正确架构?

Socket.io & Redis - Proper architecture for an io game?

我正在使用带有 Redis 架构的基本 NodeJS 缩放,但我无法配置它以适应真实的-时间多人游戏。

我的多人游戏应该有单独的大厅 - 所以当负载平衡器将用户放在单独的服务器中时,同一个大厅中的玩家无法进行通信,除非我使用 Redis.问题是,我不能在服务器之间来回发送每个动作,因为那样会使 Redis 过载,并破坏服务器实例的可伸缩性,因为现在我有将每个用户存储在每个 NodeJS 实例中(以检查冲突等),这违背了扩展的目的。除非我做错了什么?

基本NodeJS/Redis架构(对于带有大厅的 io 游戏效率低下?)

我还添加了一个单独的 运行 Manager 配置(creates/removes 大厅)大厅,并通过以下方式将信息发送到 Worker 实例Redis,所以用户可以查看可用的大厅

我考虑过让每个 NodeJS 实例成为一个单独的大厅,但负载平衡器不能那样工作。另外,没有自动缩放。

我目前的架构,展示玩家(用户)

Red 为用户

Light Pink 用于通过 Redis 从其他服务器同步到自己的用户(否则,来自其他实例的玩家将彼此不可见。而且,将无法执行简单的更新,例如作为碰撞检测)

每个玩家都是自己选择的lobby,是一个拥有XYangle和其他几个参数的对象

即使用户会加入 Worker 2Worker 'n',我仍然需要将用户配置文件转发给其他工作人员,否则不在同一 Worker 的用户将彼此可见。现在这样的话,岂不是完全违背了缩放的目的?

要么我做错了什么,要么我确定必须有解决方案!

编辑

这是我到目前为止自己想出的,尽管不确定它是否合理

我几乎没有得到任何帮助,非常感谢一些评论

发表评论作为答案

根据评论,游戏是在团队之间进行的,每个团队都有一些成员,但游戏中的每个成员都必须了解其他成员(不仅仅是他们的团队成员),因为每个成员都必须了解所有其他成员游戏里的小伙伴们,这样的设计还是不错的。

虽然应该在游戏级别进行隔离,但每个游戏都应该有自己的一组大厅,每个大厅都包含所有玩家。

我们不必为每个大厅 运行 个工人,而是一个工人可以用于一个游戏,这将更新所有大厅数据。

此外,不应使用负载均衡器在工作人员之间分配玩家,而应在应用程序中使用中间件,例如 GamePlayerManager/LobbyPlayerManager 到 add/remove 玩家 to/from 特定大厅。