如何在Akka中实现水平可伸缩性?

如何在Akka中实现水平可伸缩性?,akka,domain-driven-design,scalability,sharding,Akka,Domain Driven Design,Scalability,Sharding,Roland Kuhn在伸缩性类中解释说 异步消息传递支持垂直可伸缩性 位置透明性支持水平可伸缩性 据我所知,位置透明性只支持无状态参与者的水平可伸缩性,但对于有状态参与者,我们需要它 当您有许多有状态的参与者时,通常使用集群分片 它们一起消耗的资源(例如内存)比一个计算机上的资源多 机器 例如,我想象一个在线零售商的DDD方法,其中我有一个购物车。在峰值负载期间,我将需要创建数千个ShoppingCartAggregate参与者,应用程序可能会失去响应 在这种情况下,实现横向可伸缩性的方法

Roland Kuhn在伸缩性类中解释说

  • 异步消息传递支持垂直可伸缩性

  • 位置透明性支持水平可伸缩性

据我所知,位置透明性只支持无状态参与者的水平可伸缩性,但对于有状态参与者,我们需要它

当您有许多有状态的参与者时,通常使用集群分片 它们一起消耗的资源(例如内存)比一个计算机上的资源多 机器

例如,我想象一个在线零售商的DDD方法,其中我有一个购物车。在峰值负载期间,我将需要创建数千个ShoppingCartAggregate参与者,应用程序可能会失去响应

在这种情况下,实现横向可伸缩性的方法是通过集群切分和将参与者重新平衡到另一个节点

罗兰回答后更新:

我知道位置透明度对于集群切分是必须的,但是据我所知(事实上到目前为止),位置透明度不足以横向扩展有状态的参与者

如果您允许,我想粘贴一张幻灯片(如果您想让我删除,请告诉我):

我认为这个例子更多的是一个容错的例子,而不是一个水平可伸缩性的例子,因为我们在另一个节点B中复制参与者a,当节点a停机时,它开始处理消息

如果生活在节点A中的参与者A接收到意外的负载,消息将开始排队,并且需要更多的时间来回答,我看不到我能做什么来防止这种情况。但是,在DDD应用程序中,由于参与者的粒度,这种情况不太可能发生:所有客户端不会向同一实体发送消息

但是,如果有10000个参与者代表节点A中的不同实体,并且所有参与者都收到了意外负载,那么我们可以使用集群切分来重新平衡节点A和B之间的10000个参与者,从而实现水平可伸缩性

我正在学习分布式系统和akka,所以我尝试加入这些点,这只是一个问题,我没有做任何肯定

更新:

再次观看视频讲座,我不明白我怎么会错过你所说的关于复制有状态参与者的内容:

在这里,复制并没有太多地用于可伸缩性,但它也可以用于容错


集群分片通过利用Akka实现Actor模型所提供的位置透明度来工作。这里的要点是,只有当客户端(即与ShoppingCartAggregate对话的代码)不需要知道或关心每个特定实例的位置时,才能实现水平可伸缩性。ShardRegion可以以透明的方式将请求路由到正确的目的地。在考虑运行时的动态再平衡时,这一点变得更加重要,这意味着参与者在集群中移动,而他们的任何客户机都没有意识到差异


因此,这个问题的简短回答是,您提出了一种错误的二分法。

集群切分通过利用Akka实现Actor模型所提供的位置透明度来工作。这里的要点是,只有当客户端(即与ShoppingCartAggregate对话的代码)不需要知道或关心每个特定实例的位置时,才能实现水平可伸缩性。ShardRegion可以以透明的方式将请求路由到正确的目的地。在考虑运行时的动态再平衡时,这一点变得更加重要,这意味着参与者在集群中移动,而他们的任何客户机都没有意识到差异


因此,这个问题的简短回答是,您提出的是一种错误的二分法。

我确实理解,只有当客户端不需要知道或关心每个特定实例的位置,但这足以扩展有状态参与者时,才能实现水平可伸缩性?在你的回答之后,我做了一个小的更新,这是我脑海中的场景。是的,你的更新是正确的:一个有状态的参与者不能“缩放”,它只能为容错而复制,诀窍是按照你说的选择粒度。我发现值得注意的是,位置透明性是这两种方法的支持质量:在这种附加条件下,复制和分片可以是透明的。我确实理解,只有当客户端不需要知道或关心每个特定实例的位置,但这足以有状态的演员?在你的回答之后,我做了一个小的更新,这是我脑海中的场景。是的,你的更新是正确的:一个有状态的参与者不能“缩放”,它只能为容错而复制,诀窍是按照你说的选择粒度。我发现值得注意的是,位置透明性是这两种方法的支持质量:在这种附加条件下,复制和分片可以是透明的。