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