在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會自動重置。
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