【发布时间】:2017-05-15 15:35:42
【问题描述】:
我目前正在开发一款基于网络的 MMORPG 游戏,并希望设置基于 Docker 和 DigitalOcean 液滴的自动缩放策略。
但是,我想知道如何才能做到这一点:
我的游戏服务器必须在不同的 Docker 容器中拆分但是每个游戏服务器实例都应该像一个巨大的游戏服务器一样运行。这意味着在一个游戏服务器中发生的每个修改(角色移动)也应该在每个其他游戏服务器中进行镜像。
我试图让它工作(至少在概念上),但找不到正确同步所有实例的方法。我应该使用仅广播事件的主节点还是有替代方法?
我想知道关于我的 MySQL 数据库的同样的事情:因为每个游戏服务器都必须从数据库读取/写入数据库,随着游戏变得越来越大,我该如何使其正确扩展?我能想到的最佳解决方案是将数据库保存在一个非常强大的服务器上。
我知道,如果所有游戏服务器都不必“共享”它们的状态,这可能会很容易,但这主要是为了在活动突然激增的情况下我可以快速扩展。
(会有不同的“全局”游戏服务器,如 A、B、C……但这些全局游戏服务器中的每一个都应该在幕后由运行“真实”游戏服务器的 1-X 个 docker 容器组成所以“全球”游戏服务器只是一个概念)
【问题讨论】:
-
这似乎是一个普遍的缩放问题。无论是否在 Docker 中,问题都是一样的,对吗?
-
对,但我认为 docker 在轻松部署方面几乎是一种开箱即用的解决方案。这就是为什么我可能会用它来托管我的游戏服务器。
-
运行另一个 Docker 容器类似于运行另一个进程。它不会为您的应用程序处理状态或内存复制。应用程序仍然需要通过支持多个主机的某种总线或协议在多个进程之间实现共享状态。
-
这样的问题就是为什么魔兽世界有区域,而夏娃有系统被网格分割的原因。很可能,您需要破坏您的游乐区。
-
支持上面@Stephan 的评论,在当前的 MMO 中,每个“领域”或“服务器”都由多个(自动)扩展服务器组成,这些服务器能够服务于一个或多个较小的区域,通常用于玩家位置/运动和战斗。
标签: node.js docker scalability docker-swarm