Introduction of Akka Supervisor Strategy
每一個 Akka Actor 都會有一個 supervisor。Supervisor 會監控它產生的子 Actor,並且決定在有 Exception 發生時,該如何處理。我們實作 Actor 時,可以不去 override 它,Akka 本身有預設的 supervisor strategy.
Akka 的 supervisor strategy 有兩種:
- OneForOneStrategy
- AllForOneStrategy
簡單來說,OneForOneStrategy
是其中某個 actor 發生問題時,不會去影響到它的兄弟姊妹,而 AllForOneStrategy
則會。Akka 自身預設是 OneForOneStrategy
。
Akka 提供四種決定,
- Resume:繼續,不會 reset Actor 的資料
- Restart:重啟 Actor,會 reset Actor 的資料
- Stop: 中止 Actor
- Escalate: 將問題往上報,讓上層的 supervisor 來決定。
Akka Actor 有一個特性,就是 Actor 的資料跟工作是分開的,因此我們可以選擇用 Resume
的方式,保留資料,繼續往下處理。
Akka 預設的 strategy 處理方式
ActorInitializationException
=>Stop
ActorKilledException
=>Stop
- 其他的 Exception =>
Restart
- 其他的 Throwable =>
Escalate
所以如果我們都不作任何修改的話,當有 Exception
發生時,Akka 會自動重啟 Actor。這樣子的方式,已經符合大部分的需求。
參考資料:
實作
SupervisorDemo in Sample Code
延用 吃飯睡覺打東東 的企鵝笑話,東東,在被打第 4 次時,會說 不要打擾我,在第 6 次時,會 爆炸,在超過第 6 次後,牠就成仙了。本程式,主要是由 PenguinKing
來產生 Penguin
,也因此 PenguinKing
是 Penguin
的 supervisor。各位可以在 PenguinKing
的程式碼中,修改
override val supervisorStrategy =
OneForOneStrategy(maxNrOfRetries = 10, withinTimeRange = 1 minute) {
//AllForOneStrategy(maxNrOfRetries = 10, withinTimeRange = 1 minute) {
case _ : DontBotherMeException => Resume
case _ : ExplodeException => Restart
case _ : IamGodException => Stop
case _ : Exception => Escalate
}
或註解掉這一段程式,來了解 Akka Stragegy 的運作方式。
尤其注意在 Resume
後,Penguin
的 hits
值,並沒有被 reset。
你可以依照以下的方式修改程式,觀察輸出的結果,來了解 Akka 的 Supervisor Strategy 運作方式
在本 sample code 中,如果都不修改的話,是不會進到
IamGodException
,因為在ExplodeException
後,會重啟 Actor,而hits
值就會被改成0
,重頭計算。修改
ExplodeException => Resume
,則會進到IamGodException
, 此時 東東 就會停止了,不能再使用。修改
ExplodeException => Escalate
,則會發現全部的Penguin
actor 都被重啟了,也包括PenguinKing
。將
OneForOneStrategy
改成AllForOneStrategy
,則如果 東東 被重啟了,其他的 企鵝 也會被重啟。
沒有留言:
張貼留言