如何缩放状态的NodeJS应用

问题描述 投票:11回答:3

我目前工作的一个基于Web的MMORPG游戏,并希望建立基于泊坞窗和DigitalOcean液滴的自动缩放策略。

不过,我想知道我怎么能管理这样做:

我的游戏服务器将不得不在不同的Docker容器但每一个游戏服务器实例应该采取行动,如果它只是一个巨大的游戏服务器可分开。这意味着,每次修改在一个(字符移动)发生也应在每一个其他游戏服务器进行镜像。

我试图得到这个工作(至少在概念上),但不能找到一种方法,我所有的情况下正确地同步。我应该使用一个主只有广播的事件或者是有其他选择吗?

我想知道我的MySQL数据库同样的事情:因为每一个游戏服务器将不得不读/从/写入数据库,我将如何使其正常规模的游戏变得越来越大?我能想到的最好的解决办法是保持数据库这将是非常强大的一台服务器上。

据我所知,这可能是容易的,如果所有的游戏服务器没有“分享”他们的状态,但是这主要是认为,这样我可以在活动中突然出现大幅波动的情况下,迅速形成规模。

(会有不同的“全球性”的游戏服务器,比如A,B,C ......但每个那些全球性的游戏服务器的应该是,在幕后,1-X泊坞窗容器组成运行的“真实”的游戏服务器,以便后面的“全球性”的游戏服务器仅仅是一个概念)

node.js docker scalability docker-swarm
3个回答
5
投票

你的国家的问题是太普通,它是很难给出一个具体的回应。然而让我鲁莽,并给你一些通用的比例建议:

  • 从数据库中删除计数器。相反,主键是自动递增的ID,尝试分配随机的UUID。
  • 必须针对中心点由是自包含的数据进行验证的变化数据。例如,对于身份验证,而不必在DB的用户凭据,使用可以通过任何主机进行验证JSON网络令牌。
  • 使用诸如一致的哈希值,而不需要负载均衡来平衡负载。当然,使用该散列分布以及功能,避免/最小化冲突。

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

当然,如果这个城市太大了,这是非常拥挤的,你可能需要在城市中更多的服务器进行分区,以避免服务器过载。


4
投票

你提的问题过于宽泛,一般的比例问题,因为其他人提及。它会有所帮助,如果你说更清楚你的系统要求是什么。

如果它必须是实时的,那么你可以选择Redis的作为主数据库,但随后你需要从站(复制),您将无法自动缩放,当您去*,因为Redis的不支持。我认为这不是当你与游戏上的工作(瞬间电压尖峰是可能的)一个不错的选择

*似乎有一些托管解决方案,你需要检查出来

如果它可以近乎实时的,使用Apache卡夫卡可以证明是有用的。

还有哪个有你需要叫CockroachDB(我是一个贡献者,耶!)一切都高度可扩展的数据库,但你需要运行测试,看看它是否符合您的等待时间要求。

总体而言,具有非常强大的服务器会是一个不错的选择,因为有一个天花板,它会花费你更多的垂直扩展。


2
投票

有一个在水平扩展这样的应用有很大的好处。我会试着写下的一些想法。

选项1(状态):

在规划状态的应用程序,你需要照顾有关国家的同步(通过PubSub的,网络广播或别的东西),并知道每一个同步将需要一段时间才能发生(如果不阻止每一个操作)。如果这是对你合适,让继续。

比方说,你有你的整个集群上每秒80K操作。这意味着,每一个流程需要同步每秒80K的状态变化。这将是你的瓶颈。处理每秒80K的变化是沉寂的Node.js应用的一大挑战(因为它是单线程的,因此阻塞)。

在最后你需要提供精确的你想成为能够同步,并执行一些测试,以不同的编程语言变化的最大量。需要添加到应用程序的一般工作负载同步的开销。这可能是有益的,使用一些多线程的语言如C,Java的/斯卡拉或去。

选项2(与路由有状态):*

在某些情况下,这是可行的实现不同类型的缩放。举例而言,当您的应用程序可以被分解成一个地图区域,您可以用持有的全图,当它大大加快了,这股成比例的方式在地图上一个应用程序复制启动。你将需要实现应用服务器之间的一些路由,例如在世界B =>呼叫服务器XYZ的城市的变化状态。这可以自动完成,但缩减将是一个挑战。

这种解决方案需要更多的关心和知识有关应用程序,而不是作为容错选项为1,但它可以不断地扩展。

选项3(无状态):

移动状态下的一些其他应用程序和其他地方解决问题(如Redis的,ETCD,...)

© www.soinside.com 2019 - 2024. All rights reserved.