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

sor*_*ega 9 scala actor-model akka akka-supervision

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

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

Rob*_*ier 8

是的,通过改写supervisorStrategy.例如,来自文档:

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
  }
Run Code Online (Sandbox Code Playgroud)

然后阅读说明:

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

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

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

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

  • 我同意为A和B演员使用单独的主管的想法.它似乎是更易于管理的方法.我不认为混合主管概念是一个好主意.你可以在这个层次结构的顶部有一个主要的主管,然后是A主管的一个主管和B的一个主管.如果你想要A中的故障终止所有A演员和所有B演员那么只需升级到单个主管这个层次结构,当它停止时,它将停止整个树. (4认同)