Akka集群分片:根据通信模式移动actor分片

时间:2017-09-26 12:34:07

标签: scala akka sharding akka-cluster

我正在使用Akka构建一个开源的分布式经济模拟平台(特别是远程和集群包)。这种模拟的一个关键瓶颈是,参与者之间的通信模式在模拟过程中不断发展,并且演员通常最终会在集群中的节点之间通过线路发送大量消息。

我正在寻找一种机制来检测某些节点上的actor与某些其他节点上的actor进行大量通信并将它们移动到另一个节点。这是否可以使用现有的Akka群集分片功能?也许这就是Roland Kuhn“自动演员树分区”的意思,是他对this SO问题的回答。

1 个答案:

答案 0 :(得分:0)

通过实现自定义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,这意味着您甚至可以查询另一个actor以获取所需的信息(例如,在您的actor之间具有亲缘关系信息的actor)。

对于亲和力本身,我认为你必须自己实施。例如,参与者可以收集有关其发件人节点的统计信息,并定期发布到群集单例,以确定应将哪些参与者移动到同一节点。