Akka学习笔记(四):监督和监控

来源:互联网 发布:禾赛科技 知乎 编辑:程序博客网 时间:2024/05/01 14:29


Akka学习笔记(四):监督和监控

Supervision是什么

supervision表示actors之间的关系。监督者分配任务给下属,因此需要处理反馈的错误。根据不同的错误,监督者supervisor可以做如下操作:

  1. 恢复下属,让下属继续运行,继续接收message。当且仅当下属还可以正常运行
  2. 重启下属,清空status。一般是第一条情况中,child的异常导致无法正常运行。
  3. 关闭下属
  4. 关闭自己,向上一级汇报错误

上面的操作都是递归的。

警告
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的过程:

  1. 暂停Actor(这意味着在Restart期间,不会处理常规的消息,直到它被Resume)。同时,还会递归地暂停所有的children;
  2. 调用旧实例的preRestart钩子方法(默认情况下,会发送终止消息给所有children,调用children的postStop())。
  3. 等待所有的children被终止(调用context.stop())。这个过程是非阻塞的;
  4. 通过调用原来提供的工厂去创建新的Actor实例;
  5. 调用新实例的postRestart()方法(默认情况下,仍然要先调用preStart());
  6. 将restart的请求发送给执行第3步时没有被kill掉的children;然后遵循第2步递归地对children执行restart;
  7. 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就会受到影响。


0 0
原创粉丝点击