在Principles of Reactive Programming course Roland Kuhn在Scalability类中解释
异步消息传递支持垂直可伸缩性
位置透明度可实现水平可伸缩性
据我所知,位置透明度只能为无状态演员提供横向可扩展性,但对于有状态的演员我们需要Cluster sharding
当您拥有许多有状态的actor时,通常会使用群集分片 它们共同消耗更多的资源(例如内存)而不是一个 机
我想例如一个在线零售商的DDD方法,我有一个ShoppingCartAggregate。在高峰负载期间,我需要创建数千个ShoppingCartAggregate actor,应用程序可能会无响应。
在这种情况下,实现水平可伸缩性的方法是通过Cluster Sharding并将actor重新平衡到另一个节点?
罗兰答案后更新:
我知道位置透明度是群集分片的必要条件,但据我所知(实际上并非如此)位置透明度不足以扩展水平有状态的角色。
如果您允许,我想粘贴幻灯片(如果您要我删除它,请告诉我):
我将此示例更多地视为容错的情况,而不是水平可伸缩性的情况,因为我们在另一个节点B中复制了actor A,并且当节点A关闭时它开始处理消息。
如果生活在节点A中的演员A收到未预料到的负载,则消息将开始排队,并且将需要更多时间来回答,我无法看到任何可以阻止此操作的内容。但是在DDD方法中,由于actor的粒度不太可能发生这种情况:所有客户端都不会向同一实体发送消息。
但如果我有10000个代表生活在节点A中的不同实体并且所有实体都收到意外负载,我们就可以使用Cluster Sharding重新平衡节点A和B之间的10000个角色,从而实现水平可扩展性。
我正在学习分布式系统和akka,所以我想加入点,这只是一个问题,我没有做任何形式的肯定。
更新
再次观看视频讲座我无法理解你是如何错过你对有状态演员复制的看法:
这里,复制不是用于可伸缩性那么多,但它也可以用于容错。
答案 0 :(得分:2)
群集分片的工作原理是利用Akka实现的Actor模型提供的位置透明性。这里的要点是,只有当客户端(即与ShoppingCartAggregate对话的代码)不需要知道或关心每个特定实例所在的位置时,才能实现水平可伸缩性 - ShardRegion可以将请求路由到正确的目的地。透明时尚。在运行时考虑动态重新平衡时,这变得更加重要,这意味着演员在集群中移动而没有任何客户意识到差异。
因此,对这个问题的简短回答是你提出了错误的二分法。