我目前正在开发基于Web的MMORPG游戏,并希望基于Docker和DigitalOcean Droplet设置自动缩放策略。
但是,我想知道如何才能做到这一点:
我的游戏服务器必须可以在不同的Docker容器中拆分,但每个游戏服务器实例的行为都应该像是一个巨大的游戏服务器一样。这意味着在一个游戏中进行的每个修改(角色移动)也应该在其他所有游戏服务器中进行镜像。
我试图使它工作(至少在概念上),但是找不到正确同步所有实例的方法。我应该只使用主机广播事件还是有替代方法?
我在想关于我的MySQL数据库的同一件事:由于每个游戏服务器都必须从数据库读取数据/向数据库写入数据,因此随着游戏变得越来越大,我如何使其正确缩放?我能想到的最好的解决方案是将数据库保留在非常强大的单个服务器上。
我知道,如果所有游戏服务器不必“共享”它们的状态,这可能很容易,但这主要是为了让我能够在活动突然增加的情况下快速扩展。
(将有不同的“全局”游戏服务器,如A,B,C ...,但每个全局游戏服务器在后台应由运行“真实”游戏服务器的1-X docker容器组成,这样, “全球”游戏服务器只是一个概念)
您指出的问题过于笼统,很难给出具体的答案。但是,请允许我鲁re,并为您提供一些通用的缩放建议:
从数据库中删除计数器。而是使用自动递增ID的主键,尝试分配随机UUID。
更改必须通过一个自包含的数据针对一个中心点进行验证的数据。例如,对于身份验证,请使用可被任何主机验证的JSON Web令牌,而不是在数据库中包含用户凭据。
使用诸如“一致性哈希”之类的技术来平衡负载,而无需负载均衡器。当然,请使用散布良好的散列函数,以避免/最大程度地减少冲突。
以上建议基本上是关于从尽可能多的方面将设计更改为从有状态迁移到无状态的建议。无论如何,如果您需要提供有状态部分,请尝试猜测哪些实体将有更多机会共享有状态数据并在相同(或接近服务器)中分配它们。例如,如果您的游戏中有城市,请尝试在同一服务器上分配同一城市中的用户,因为与不同城市中的用户相比,他们更愿意在它们之间进行交互(并共享有状态数据)。
当然,如果城市太大并且非常拥挤,您可能需要将城市划分为更多服务器,以避免服务器超负荷。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句