Akka 和 Supervisor 回退策略

Akka and Supervisor Strategies that fallback

我是 Akka 的新手,但我对 Stop 指令的 理解 是当 child 应被视为永久停止服务,但有一种方法可以处理总中断。

如果这种理解是正确的,那么我想做的是在 normal/primary child 停止并从那里使用之后,应该有某种“后备演员”指向前方作为后备。例如,假设我有一个 parent 演员,他有一个 child 演员 - Notifier - 其工作是发送电子邮件。如果 Notifier 真的死了(比如,底层邮件服务器离线),这个参与者的备份可能是另一个参与者,比如 QueueClient,它将通知请求发送到消息代理,其中消息将排队并稍后重播。

如何定义这样一个 SupervisorStrategy 以在其中包含此内置故障 tolerance/actor 备份?请展示代码示例,这是我学习的唯一方法!

在默认指令之外覆盖 Supervisor Strategies 并不常见,在您的情况下也不是必需的。一个解决方案是从 parent 观察 child 演员,当 parent 发现 child 停止时,让备用演员参与。

进口akka.actor.SupervisorStrategy.Stop 导入 akka.actor._

class Parent extends Actor {

  var child: ActorRef = context.actorOf(Props[DefaultChild])
  context.watch(child)

  def receive = {
    case Terminated(actor) if actor == child => 
      child = context.actorOf(Props[BackupChild])
  }

  override def supervisorStrategy = OneForOneStrategy() {
    case ex: IllegalStateException => Stop
  }
}

class DefaultChild extends Actor {

  def receive = { case _ => throw new IllegalStateException("whatever") }
}

class BackupChild extends Actor {

  def receive = { case _ => }
}