Akka学习笔记(四):监督和监控
Akka学习笔记(四):监督和监控
Supervision是什么
supervision表示actors之间的关系。监督者分配任务给下属,因此需要处理反馈的错误。根据不同的错误,监督者supervisor可以做如下操作:
- 恢复下属,让下属继续运行,继续接收message。当且仅当下属还可以正常运行
- 重启下属,清空status。一般是第一条情况中,child的异常导致无法正常运行。
- 关闭下属
- 关闭自己,向上一级汇报错误
上面的操作都是递归的。
警告
supervision发送的是system messages,用的mailbox也和普通的messages不一样。
顶层的Supervisors
一个actor system在启动期间,会至少创建3个actors,如上图所示
/user
:监护Actor
它是用户创建的Actor的parent,命名为“/user”。使用system.actorOf()方法创建的Actor都是它的children。这意味着只要这个Actor终止了,系统中所有常规的Actor都会被关掉。在Akka 2.1中,可以设置Supervisor Strategy,配置项为akka.actor.guardian-supervisor-strategy,对应类名为SupervisorStrategyConfigurator。倘若这个Guardian Actor扩大了失败,按照前面描述的Supervisor策略,它会使得root guardian终止该Actor,从而使得这个Actor下的所有子Actor都停止,即关掉了整个Actor系统。
/system
:系统监护Actor
名为“/system”。主要是为了在常规Actor被终止时,做到按序的shut-down顺序。它可以监控User Guardian。可以管理Top-Level的System Actor采用一种策略,可以在除了ActorInitializationException与ActorKilledException之外的异常出现时,无限制地重启它。
/
:Root监护Actor
由于每个真正的Actor都有一个supervisor,因此,root guardian的supervisor不是一个真正的Actor。
当出现如下三类失败错误时,就可能Restart Actor:
- 在收到特定消息时,发生系统错误,如编程的错误;
- 在处理消息时,因为一些外部资源的原因出现错误;
- Actor的内部状态出现问题
Restart的过程:
- 暂停Actor(这意味着在Restart期间,不会处理常规的消息,直到它被Resume)。同时,还会递归地暂停所有的children;
- 调用旧实例的preRestart钩子方法(默认情况下,会发送终止消息给所有children,调用children的postStop())。
- 等待所有的children被终止(调用context.stop())。这个过程是非阻塞的;
- 通过调用原来提供的工厂去创建新的Actor实例;
- 调用新实例的postRestart()方法(默认情况下,仍然要先调用preStart());
- 将restart的请求发送给执行第3步时没有被kill掉的children;然后遵循第2步递归地对children执行restart;
- resume actor。
Lifecycle Monitoring
对于Monitoring而言,能监控的状态就是alive到dead之间的迁移。因此,在Akka中,Lifecycle Monitoring指的就是DeathWatch。Monitoring主要指的是监控其他的Actor,而非Supervision层次中的Actor。
监控的Actor(Monitoring Actor)如果接受到一条Terminated消息,默认行为就会抛出DeathPactException。要侦听Terminated消息,可以调用ActorContext.watch(targetActorRef);停止监听则调用ActorContext.unwatch(targetActorRef)。
如果Supervisor不能简单地重启其Children,又必须终止他们,例如在初始化Actor时出现了错误,就可以使用Monitoring。此时,可以侦听这些children,然后重新创建他们,或者安排时间重试。
使用Monitoring的另一种常见情形是,在缺乏外部资源,且该外部资源属于该Actor的一个children,Actor需要失败。如果第三方通过system.stop(child)或者发送PoisonPill去终止child,supervisor就会受到影响。
最后更新:2017-04-03 05:39:33