Akka延迟重启《nineteen》

Delayed restarts with the BackoffSupervisor pattern

在Akka中,实现exponential backoff supervision strategy的akka.pattern.BackoffSupervisor做为内置模式提供。每次当子actor失败后重启,每次重启之间的时间延迟都会增长。html

当启动的actor失败时,此模式颇有用,由于某些外部资源不可用,咱们须要给它一些时间再次启动。其中一个有用的主要示例是PersistentActor失败(经过中止)持久性失败 - 这代表数据库可能已关闭或过载,在这种状况下,给它一点点时间是最有意义的。java

下面的Scala片断展现了如何建立一个backoff监督器,它将在因故障而中止后启动,增长3,6,12,24和最后30秒的间隔:数据库

以上至关于这个Java代码:dom

强烈建议使用randomFactor为backoff间隔添加一些额外的方式,以免多个actor在彻底相同的时间点从新启动,例如由于它们因共享资源(例如a)而被中止数据库在相同的配置间隔后降低并从新启动。经过在从新启动间隔中添加额外的随机性,Actor将在稍微不一样的时间点开始,从而避免大量的流量峰值到达恢复的共享数据库或他们都须要联系的其余资源。spa

Actor崩溃后,而且监督策略决定应该从新启动,akka.pattern.BackoffSupervisor actor也能够配置为延迟启动。rest

Scala片断展现了如何建立一个backoff supervisor,由于一些异常,它将在崩溃后启动给定的echo actor,增长3,6,12,24和最后30秒的间隔。htm

与下面的java代码相等:blog

akka.pattern.BackoffOptions可用于自定义 back-off supervisor actor的行为,下面是一些示例:生命周期

上面的代码设置了一个back-off supervisor,它要求子actor在成功处理消息时向其父节点发送akka.pattern.BackoffSupervisor.Reset消息,重置后退。它还使用默认中止策略,任何异常都会致使孩子中止。进程

若是抛出MyException,上面的代码会设置一个 back-off supervisor,任何其余异常都会升级。若是孩子在10秒内没有抛出任何异常,则back-off会自动重置。

One-For-One Strategy vs All-For-One Strategy

Akka有两类监督策略:OneForOneStrategy和AllForOneStrategy。二者都配置了从异常类型到监督指令的映射,并限制了在终止子进程以前容许子进程失败的频率。它们之间的区别在于前者仅将得到的指令应用于失败的子节点,然后者也将其应用于全部兄弟节点。一般,您应该使用OneForOneStrategy,若是没有明确指定,也是默认值。

AllForOneStrategy适用于子群体之间存在紧密依赖关系的状况,即一个孩子的失败会影响其余孩子的功能,即它们是密不可分的。因为重启不会清除mailbox,所以一般最好在故障时终止子节点并从主管明确从新建立它们(经过观察子节点的生命周期);不然你必须确保任何一个actor都没有问题,它们会在从新启动以前收到一条消息,但以后会进行处理。

一般中止孩子(不是对失败的响应)不会自动终止其余孩子,采用一对一的策略,能够经过观察他们的生命周期来完成:若是被监管者没有处理Terminated消息,它将抛出一个DeathPactException(取决于它的主管)将从新启动它,默认的preRestart动做将终止全部子进程。固然,这也能够明确处理。

请注意,从一个all-for-one supervisor建立one-off actors须要临时演员升级的失败将影响全部永久演员。若是不须要,请安装中级主管;这能够经过为工做员声明一个大小为1的路由器来完成,后续再看Routing

原文:https://doc.akka.io/docs/akka/2.5/general/supervision.html

相关文章
相关标签/搜索