我正在使用Akka构建一个开源的分布式经济模拟平台(特别是远程和集群包)。这种模拟的一个关键瓶颈是,参与者之间的通信模式在模拟过程中不断发展,并且演员通常最终会在集群中的节点之间通过线路发送大量消息。
我正在寻找一种机制来检测某些节点上的actor与某些其他节点上的actor进行大量通信并将它们移动到另一个节点。这是否可以使用现有的Akka群集分片功能?也许这就是Roland Kuhn“自动演员树分区”的意思,是他对this SO问题的回答。
答案 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)。
对于亲和力本身,我认为你必须自己实施。例如,参与者可以收集有关其发件人节点的统计信息,并定期发布到群集单例,以确定应将哪些参与者移动到同一节点。