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 _ => }
}
我是 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 _ => }
}