日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Actor生命周期理解

發布時間:2024/1/23 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Actor生命周期理解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Actor生命周期理解

鎮圖:Actor內功心法圖

Actor的生命周期可以用Hooks體現和控制,下面是默認的Actor Hooks的方法,我們可以選擇性的進行重寫:

def preStart(): Unit = ()def postStop(): Unit = ()def preRestart(reason: Throwable, message: Option[Any]): Unit = {context.children foreach { child ?context.unwatch(child)context.stop(child)}postStop() }def postRestart(reason: Throwable): Unit = {preStart() }

每個Hooks,在不同的策略下調用次數及順序是不同的,那什么是策略?:

class DbSupervisor extends Actor {override def supervisorStrategy = OneForOneStrategy() {//如果dbWriter失敗,則調用Restart策略,重啟該出錯的Actorcase _: DbBrokenConnectionException => Restart}

策略,比如Restart,實際上就是執行了一系列的方法包括:preRestart,postRestart

Start策略

Start策略,調用preStart Hook,一般用于初始化資源.在創建一個Actor的時候,會調用構造函數,之后調用preStart,那這兩個方法有什么區別呢,資源初始化是放在構造函數,還是放在preStart里面呢?在Restart策略里面會詳細介紹。

Stop策略

postStop hook 一般用于回收資源。Actor在被調用postStop之前,會將郵箱中剩下的message處理掉(新的消息變成死信了)。Actor是由UID和Path來唯一標識的,也就是說ActorRef也是通過UID和Path來定位。在Actor被Stop之后,新的Actor是可以用這個Path的,但是舊的ActorRef是不能用的,因為UID不一樣。

Restart策略

Restart策略是最為復雜的一種情況,先上個圖:

在默認情況下,Restart策略會:

  • actor被掛起
  • 調用舊實例的 supervisionStrategy.handleSupervisorFailing 方法 (缺省實現為掛起所有的子actor)
  • 調用preRestart方法,從上面的源碼可以看出來,preRestart方法將所有的children Stop掉了!(Stop動作,大家注意!),并調用postStop回收資源
  • 調用舊實例的 supervisionStrategy.handleSupervisorRestarted 方法 (缺省實現為向所有剩下的子actor發送重啟請求)
  • 等待所有子actor終止直到 preRestart 最終結束
  • 再次調用之前提供的actor工廠創建新的actor實例
  • 對新實例調用 postRestart
  • 恢復運行新的actor
  • Restart策略,和Stop策略有什么不同的地方?
    Stop策略會調用postStop(),Restart策略也會調用postStop(),但是Restart策略不是通過Stop策略來停止舊的Actor,UID和Path都沒變。也就是說,在被Restart之后,不用重新獲取ActorRef.

    preRestart Hook有什么特別之處?
    默認的preRestart Hook會將所有的Children通過Stop策略停止,這個時候Children就是通過Stop策略->Start策略啟動的,而不是被遞歸Restart.那有什么影響?如果有外部的Actor持有舊的Chidren ActorRef,那這個Ref就是不能用的,因為雖然Path是對的,但是UID已經變了!

    postRestart Hook有什么特別之處?
    默認postRestart是調用preStart(),這樣在重啟的過程中,構造函數和preStart方法都會被重新調用,如果有個資源只想初始化一次,那么就必須重寫掉這個方法.所以一般創建children是放在preStart里面。

    override def preStart(): Unit = {// 初始化children }// 重寫postRestart防止preStart每次重啟都被調用 override def postRestart(reason: Throwable): Unit = ()override def preRestart(reason: Throwable, message: Option[Any]): Unit = {// 任然要清理自己,但是不Stop childrenpostStop() }

    被重啟后,如何繼承舊的actor的狀態?
    通過將state轉儲到:

    • 數據庫(案例:Hbase,也是鄭草原的實時計算集群采用的持久化方法)
    • 官方的包akka-persistence-experimental(測試階段),?ppt介紹?and?Persistence文檔
    • 非JVM級別的crash,使用靜態類保存狀態
    創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的Actor生命周期理解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。