Akka 集群分片:基于通信模式移动参与者分片

Akka cluster-sharding: moving actor shards based on communication patterns

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

我正在寻找一种机制来检测某个节点上与其他节点上的参与者进行大量通信的参与者,并将它们移动到另一个节点。这可能使用现有的 Akka 集群分片功能吗?也许这就是 Roland Kuhn meant by "automatic actor tree partitioning" is his answer to 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]]

第一个确定分配新分片时将选择哪个区域,并为您提供已分配的分片。第二个定期调用,让您控制将哪些分片重新平衡到另一个区域(例如,如果它们变得太不平衡)。

两者都是return一个Future,这意味着你甚至可以查询另一个actor来获取你需要的信息(例如,一个actor拥有你的actor之间的affinity信息)。

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