如何在Akka中实现水平可伸缩性?
Roland Kuhn在伸缩性类中解释说如何在Akka中实现水平可伸缩性?,akka,domain-driven-design,scalability,sharding,Akka,Domain Driven Design,Scalability,Sharding,Roland Kuhn在伸缩性类中解释说 异步消息传递支持垂直可伸缩性 位置透明性支持水平可伸缩性 据我所知,位置透明性只支持无状态参与者的水平可伸缩性,但对于有状态参与者,我们需要它 当您有许多有状态的参与者时,通常使用集群分片 它们一起消耗的资源(例如内存)比一个计算机上的资源多 机器 例如,我想象一个在线零售商的DDD方法,其中我有一个购物车。在峰值负载期间,我将需要创建数千个ShoppingCartAggregate参与者,应用程序可能会失去响应 在这种情况下,实现横向可伸缩性的方法
- 异步消息传递支持垂直可伸缩性
- 位置透明性支持水平可伸缩性
集群分片通过利用Akka实现Actor模型所提供的位置透明度来工作。这里的要点是,只有当客户端(即与ShoppingCartAggregate对话的代码)不需要知道或关心每个特定实例的位置时,才能实现水平可伸缩性。ShardRegion可以以透明的方式将请求路由到正确的目的地。在考虑运行时的动态再平衡时,这一点变得更加重要,这意味着参与者在集群中移动,而他们的任何客户机都没有意识到差异
因此,这个问题的简短回答是,您提出了一种错误的二分法。集群切分通过利用Akka实现Actor模型所提供的位置透明度来工作。这里的要点是,只有当客户端(即与ShoppingCartAggregate对话的代码)不需要知道或关心每个特定实例的位置时,才能实现水平可伸缩性。ShardRegion可以以透明的方式将请求路由到正确的目的地。在考虑运行时的动态再平衡时,这一点变得更加重要,这意味着参与者在集群中移动,而他们的任何客户机都没有意识到差异
因此,这个问题的简短回答是,您提出的是一种错误的二分法。我确实理解,只有当客户端不需要知道或关心每个特定实例的位置,但这足以扩展有状态参与者时,才能实现水平可伸缩性?在你的回答之后,我做了一个小的更新,这是我脑海中的场景。是的,你的更新是正确的:一个有状态的参与者不能“缩放”,它只能为容错而复制,诀窍是按照你说的选择粒度。我发现值得注意的是,位置透明性是这两种方法的支持质量:在这种附加条件下,复制和分片可以是透明的。我确实理解,只有当客户端不需要知道或关心每个特定实例的位置,但这足以有状态的演员?在你的回答之后,我做了一个小的更新,这是我脑海中的场景。是的,你的更新是正确的:一个有状态的参与者不能“缩放”,它只能为容错而复制,诀窍是按照你说的选择粒度。我发现值得注意的是,位置透明性是这两种方法的支持质量:在这种附加条件下,复制和分片可以是透明的。