想象一下,您有一项服务可以在四个欧洲国家的首都返回餐厅评级:
使用Akka,想象你将每个城市分配给一个Actor,然后将这些角色划分为两个节点(想想Akka Cluster)。如果我们按字母顺序天真地对我们的演员进行分类,那么结果是:
显然交通非常不平衡。如果你事先不知道城市的人口,Akka是否提供了动态重新配置你如何分割这些城市的工具?
我感谢任何指针或参考。谢谢你的帮助!
答案 0 :(得分:1)
正如您所提到的,Cluster Sharding允许您轻松地在整个群集中分发您的actor。默认情况下,在区域(节点)上创建一个新分片,分配的分片数量最少(LeastShardAllocationStrategy
),但您可以使用不同的规则轻松创建自己的自定义ShardAllocationStrategy
。
为此,请扩展ShardAllocationStrategy
并实施这两种方法:
def allocateShard(requester: ActorRef, shardId: ShardId,
currentShardAllocations: Map[ActorRef, immutable.IndexedSeq[ShardId]])
: Future[ActorRef]
def rebalance(currentShardAllocations: Map[ActorRef,
immutable.IndexedSeq[ShardId]], rebalanceInProgress: Set[ShardId])
: Future[Set[ShardId]]
第一个确定在分配新分片时将选择哪个区域,并为您提供已分配的分片。 第二个定期调用,让您控制哪些分片重新平衡到另一个区域(例如,如果它们变得太不平衡)。
这两个函数都返回一个Future
,这意味着您甚至可以查询另一个演员以获取您需要的信息(例如,在您的情况下,获取每个城市的“权重”以选择具有该区域的区域最小的重量。)
答案 1 :(得分:0)
我认为Cluster Sharding可能是我需要的Akka功能。