翻译自:http://doc.akka.io/docs/akka/2.3.8/general/supervision.html
督导与监控
本章大概描述督导背后的概念,提供的原语和语义。如何转换成实际代码的细节请参考相关的 Scala 和 Java API。
督导意味着什么
如 Actor 系统 里描述的,督导描述了 actors 之间的依赖关系:督导者委托任务给下属,因此必须为它们的失败负责。当一个下属检测到一个失败(例如抛出异常),它挂起自己和它的所有下属,它的督导者发送一个提示失败的消息。取决于被督导的工作的性质和失败的性质,督导者有下面四个选择:
- 让下属继续执行,保持当前的内部状态;
- 重启下属,清理它的当前内部状态;
- 永久停止下属;
- 向上传递失败,使自己失败。
总是把一个 actor 当作督导层级的一部分是很重要的,这解释了四种选择的存在(一个督导者也是另一个更高级的督导者的下属),且前三者暗示着:让一个 actor 继续执行将执行它的所有下属,重启一个 actor 将重启它的所有下属(但有更多细节见下面),相似地,终止一个 actor 将终止它的所有下属。要注意的是,Actor
类的 preRestart
钩子的默认行为是在重启前终止它的所有下属,但这个钩子可以被覆写;在这个钩子被执行后,递归重启被应用到所有的孩子上。
每个督导者配置了一个函数来翻译所有可能的失败原因(如异常)到上面给出的四种选择之一;注意,这个函数不接受失败的 actor 本身作为输入。很容易提出一种示例结构让这个看起来不够灵活,例如,希望为不同的下属应用不同的策略。此刻,明白督导是形成递归的失败处理结构是很重要的。如果你尝试在某一层做太多,将难以理解,因此,对这种情况推荐的方式是添加一个督导层级。