Akka 在群集中处理崩溃的远程参与者

Akka 在群集中处理崩溃的远程参与者,akka,Akka,我是阿克卡的新手。我建立了一个阿克卡集群。在集群中,我有一个节点作为主节点,它将工作分配给从节点。主节点将首先启动。然后从节点将向主节点注册它们的slve。如果从机优雅地离开,主机将收到一条消息 message instanceof Terminated 然后主节点将为从节点执行一些恢复。但是如果奴隶只是崩溃了,我怎么处理呢。当前,控制台将错误打印为“连接被拒绝”。谁能告诉我如何捕捉这个错误并知道这个崩溃的从节点的ActorRef,以便主节点对崩溃的从节点进行类似的恢复 非常感谢您可以维护其他

我是阿克卡的新手。我建立了一个阿克卡集群。在集群中,我有一个节点作为主节点,它将工作分配给从节点。主节点将首先启动。然后从节点将向主节点注册它们的slve。如果从机优雅地离开,主机将收到一条消息

message instanceof Terminated
然后主节点将为从节点执行一些恢复。但是如果奴隶只是崩溃了,我怎么处理呢。当前,控制台将错误打印为“连接被拒绝”。谁能告诉我如何捕捉这个错误并知道这个崩溃的从节点的ActorRef,以便主节点对崩溃的从节点进行类似的恢复

非常感谢

您可以维护其他节点地址的列表(或映射),其中包含相应的ActorRef-s(或actor路径)。您还可以订阅集群消息(如UnreachableMember),并在接收时执行一些恢复

大概是这样的:

class ClusterRefRecoverExample extends Actor {

  private val membersWithActorRefs = collection.mutable.HashMap[Address, ActorRef]()

  override def preStart() {
    super.preStart()
    val cluster = Cluster(context.system)
    cluster.subscribe(self, classOf[MemberEvent])
    cluster.subscribe(self, classOf[UnreachableMember])
  }

  override def postStop() {
    super.postStop()
    Cluster(context.system).unsubscribe(self)
  }

  def recoverAddress(addr: Address) {
    membersWithActorRefs.get(addr) foreach {
      theRef =>
        // do your recover here
    }
  }

  def removeAddress(addr: Address) {
    membersWithActorRefs.remove(addr)
  }

  def receive = {

    ....

    case UnreachableMember(member) =>      
      recoverAddress(member.address)

    case MemberRemoved(member, _) =>
      removeAddress(member.address)

    case MemberExited(member) =>
        removeAddress(member.address)
  }

}

从集群文档中:


“死亡观察对群集中的节点使用群集故障检测器,即,除了正常终止被观察的参与者之外,它还会从网络故障和JVM崩溃中生成终止消息。”——

死亡观察只能检测正常死亡。如果节点变得不可访问,死亡观察似乎无法检测到它——如果您使用的是Akka 2.2或更高版本。