Akka cluster-sharding:根据通信模式移动actor碎片

Akka cluster-sharding:根据通信模式移动actor碎片

问题描述:

我正在使用Akka(特别是远程和集群软件包)构建一个开源分布式经济仿真平台。这种仿真中的一个关键瓶颈是,参与者之间的通信模式在仿真过程中演变,并且通常参与者最终会通过群集中节点之间的线路发送大量消息。Akka cluster-sharding:根据通信模式移动actor碎片

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

根据自己的逻辑移动碎片可以通过实现自定义ShardAllocationStrategy来实现。

你只需要扩展ShardAllocationStrategy和执行这些2种方法:

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)。

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