gpt4 book ai didi

node.js - 如何扩展 NodeJS 有状态应用程序

转载 作者:IT老高 更新时间:2023-10-28 12:46:16 26 4
gpt4 key购买 nike

我目前正在开发一款基于网络的 MMORPG 游戏,并希望设置基于 Docker 和 DigitalOcean 液滴的自动缩放策略。

但是,我想知道如何才能做到这一点:

我的游戏服务器必须在不同的 Docker 容器中拆分但是每个游戏服务器实例都应该像一个巨大的游戏服务器一样运行。这意味着在一个游戏服务器中发生的每个修改(角色移动)也应该在每个其他游戏服务器中进行镜像。

我试图让它工作(至少在概念上),但找不到正确同步所有实例的方法。我应该使用仅广播事件的主 Node 还是有替代方法?

我想知道关于我的 MySQL 数据库的同样的事情:因为每个游戏服务器都必须从数据库读取/写入数据库,随着游戏变得越来越大,我将如何使其正确扩展?我能想到的最佳解决方案是将数据库保存在一个非常强大的服务器上。

我知道,如果所有游戏服务器都不必“共享”它们的状态,这可能很容易,但这主要是为了让我可以在事件突然激增的情况下快速扩展。

(会有不同的“全局”游戏服务器,例如 A、B、C……但这些全局游戏服务器中的每一个都应该在幕后由运行“真实”游戏服务器的 1-X 个 docker 容器组成所以“全局”游戏服务器只是一个概念)

最佳答案

你说的问题太笼统了,很难给出具体的回应。但是,让我鲁莽地给你一些通用的扩展建议:

  • 从数据库中删除计数器。相反,作为自动递增 ID 的主键,尝试分配随机 UUID。

  • 更改必须通过自包含数据针对中心点进行验证的数据。例如,对于身份验证,不要使用数据库中的用户凭据,而是使用可由任何主机验证的 JSON Web token 。

  • 使用一致性哈希等技术来平衡负载,而无需负载平衡器。当然要使用分布良好的散列函数,以避免/最小化冲突。

上述建议基本上是关于尽可能多地更改设计以从有状态迁移到无状态。如果您无论如何都需要提供有状态部分,请尝试猜测哪些实体将有更多机会共享有状态数据并将它们分配在同一个(或接近服务器)中。例如,如果您的游戏中有城市,请尝试在同一服务器中分配位于同一城市的用户,因为与不同城市的用户相比,他们更愿意在它们之间进行交互(并共享有状态数据)。

当然,如果城市太大而且很拥挤,你可能需要将城市划分为更多的服务器,以避免服务器过载。

关于node.js - 如何扩展 NodeJS 有状态应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43983500/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com