【问题标题】:Akka cluster-sharding: moving actor shards based on communication patternsAkka 集群分片:基于通信模式移动参与者分片
【发布时间】:2017-09-27 08:02:01
【问题描述】:

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

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

【问题讨论】:

    标签: scala akka sharding akka-cluster


    【解决方案1】:

    通过实现自定义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)。

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

    【讨论】:

      猜你喜欢
      • 2020-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-26
      相关资源
      最近更新 更多