为Akka 2演员的不同孩子制定不同的监督策略是否可行/可取?

时间:2014-01-21 19:28:49

标签: scala akka actor-model akka-supervision

我正在和Akka一起玩,我有一个设计,其中一个主管演员有一个孩子扮演角色A和几个孩子扮演角色B.我想定义一个监督政策,如A失败升级(终止主管)而B则生成要重新启动的各个角色。

这可能吗?这是可取的吗?

1 个答案:

答案 0 :(得分:7)

是的,覆盖supervisorStrategy。例如,from the docs

import akka.actor.OneForOneStrategy
import akka.actor.SupervisorStrategy._
import scala.concurrent.duration._

override val supervisorStrategy =
  OneForOneStrategy(maxNrOfRetries = 10, withinTimeRange = 1 minute) {
    case _: ArithmeticException      => Resume
    case _: NullPointerException     => Restart
    case _: IllegalArgumentException => Stop
    case _: Exception                => Escalate
  }

然后阅读说明:

  

如果策略是在监督actor中声明的(而不是在伴随对象中),则其决策者可以以线程安全的方式访问actor的所有内部状态,包括获取对当前失败的子节点的引用(可用)作为失败消息的发送者)。

因此,不是匹配异常的类型,而是匹配发件人(只需在此处键入;它可能无法编译):

override val supervisorStrategy =
  OneForOneStrategy(maxNrOfRetries = 10, withinTimeRange = 1 minute) {
    if (sender == SomeSpecialChild) Escalate
    else Restart
  }

这没有什么不妥,但是如果你有一群孩子扮演不同的角色,你应该遵循Akka的第一条规则(好吧,我的第一个Akka规则):当有疑问时,你可能想要另一个演员。创建一个角色来监督角色A,另一个角色来监督角色B.你仍然需要覆盖supervisorStrategy,但测试会更简单。并且管理角色A和B之间的任何其他特殊差异会更容易。