我目前正在开发一个基于网络的MMORPG游戏,并希望根据Docker和DigitalOcean液滴设置一个自动缩放策略.
不过,我想知道我该怎么办?
我的游戏服务器将不得不在不同的Docker容器中进行分割,但是每个游戏服务器实例应该像只是一个巨大的游戏服务器一样.这意味着在一个(角色移动)中发生的每个修改也应该在每个其他游戏服务器中镜像.
我试图让这个工作(至少在概念上),但找不到一种正确同步所有我的实例的方法.我应该使用主播广播事件还是有其他选择?
我想知道MySQL数据库是一样的:由于每个游戏服务器都必须从数据库读取/写入数据,所以随着游戏越来越大,我将如何使其正确扩展?我可以想到的最好的解决方案是将数据库保存在一个非常强大的单一服务器上.
我明白,如果所有的游戏服务器都不需要“分享”他们的状态,这可能很容易,但是这主要是因为我可以在突然的活动飙升的情况下快速扩展.
(将有不同的“全球”游戏服务器,如A,B,C …但是每个全球游戏服务器都应该在幕后组成,它们由运行“真实”游戏服务器的1-X码头集装箱组成,“全球”游戏服务器只是一个概念)
>从数据库中删除计数器.相反,主键是自动递增的ID,尝试分配随机的UUID.
>根据自包含的数据更改必须对中心点进行验证的数据.例如,对于身份验证,而不是将用户凭据存储在数据库中,请使用可由任何主机验证的JSON Web令牌.
>使用一致的哈希技术来平衡负载,而不需要负载平衡器.当然,使用散列函数分布不错,以避免/最小化冲突.
上述建议基本上是关于改变设计,尽可能多地从状态迁移到无国籍状态.如果您仍然需要提供有状态的部分,请尝试猜测哪些实体将有更多的机会共享有状态数据并将其分配到相同(或几乎服务器)中.例如,如果您的游戏中有城市,请尝试在同一台服务器中分配同一城市的用户,因为他们更愿意与不同城市的用户进行互动(并共享有状态数据).
当然,如果这个城市太大,而且这个城市非常拥挤,那么你可能需要在更多的服务器上分配城市,以避免服务器超载.