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