2014年7月29日 星期二

Akka Supervisor Strategy  簡介 (Deprecated)

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。這樣子的方式,已經符合大部分的需求。

參考資料:

實作

Sample Code

延用 吃飯睡覺打東東 的企鵝笑話,來 demo Akka Strategy 的功能,名叫 東東 的企鵝,在被打第 4 次時,會說 不要打擾我,在第 6 次時,會 爆炸,在超過第 6 次後,牠就成仙了。本程式,主要是由 Reporter 來產生 Penguin,也因此 ReporterPenguin 的 supervisor。各位可以在 Reporter 的程式碼中,修改

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 後,Penguinhit 值,並沒有被 reset。

你可以依照以下的方式修改程式,觀察輸出的結果,來了解 Akka 的 Supervisor Strategy 運作方式

  • 在本 sample code 中,如果都不修改的話,是不會進到 IamGodException,因為在 ExplodeException後,會重啟 Actor,而 hit 值就會被改成 0,重頭計算。

  • 修改 ExplodeException => Resume,則會進到 IamGodException, 此時 東東 就會停止了,不能再使用。

  • 修改 ExplodeException => Escalate,則會發現全部的 Penguin actor 都被重啟了,也包括 Reporter

  • OneForOneStrategy 改成 AllForOneStrategy,則如果 東東 被重啟了,其他的 企鵝 也會被重啟。

可參考前兩篇的內容:

張貼留言