squbs-3.運行時的生命周期和API

原文地址:Runtime Lifecycle & API

生命周期是一個真正需要關注的基礎。應用程序很少接觸或感知到系統的生命周期。系統組件、管理員控制臺、應用組建、actors會經過很長一段時間的初始化,并且為了traffic了解系統生命周期,系統必須在可用前完全初始化。后面包括諸如控制器(controller)、緩存加載器(cache loaders)、設備初始化器等等。

squbs運行時暴露以下生命周期狀態:

  • Starting - squbs啟動時的狀態

  • Initializing - Unicomplex已啟動. Services啟動中. Cubes啟動中. 等待初始化報告.

  • Active - 準備工作和執行服務調用

  • Failed - Cube可能沒有啟動

  • Stopping - Unicomplex收到GracefulStop消息 停止cube, actor, 和未綁定的service.

  • Stopped - 運行中的squbs已停止. Unicomplex終止. ActorSystem終止.

生命周期鉤子(Hooks)

大多數的actor不關心他們什么時候啟動或者停止。然而,他們可能為同一類actor,在他們達到接收一般trafiic狀態前需要初始化。同樣的,一些actor同樣關心在關閉前被通知到,以允許在發送他們毒藥丸(poison pill)之前適當的清理。生命周期的鉤子存在就是為了這個原因。

你可以通過發送ObtainLifecycleEvents(狀態: LifecycleState*)Unicomplex()將你actor注冊到生命周期事件中。一旦系統的狀態改變,你的actor將會接收到生命周期狀態。

你同樣可以通過向Unicomplex()發送SystemState來獲得當前的系統狀態。你將會獲得以上其中一種狀態的回復。所有的系統狀態對象繼承自org.squbs.unicomplex.LifecycleState , 并且所有都屬于 org.squbs.unicomplex 包,見下列表:

  • case object Starting extends LifecycleState
  • case object Initializing extends LifecycleState
  • case object Active extends LifecycleState
  • case object Failed extends LifecycleState
  • case object Stopping extends LifecycleState
  • case object Stopped extends LifecycleState

啟動鉤子(Hooks)

一個actor希望參與初始化時必須指出,于是在squbs的元數據 META-INF/squbs-meta.conf如下:

cube-name = org.squbs.bottlecube
cube-version = "0.0.2"
squbs-actors = [
  {
    class-name = org.squbs.bottlecube.LyricsDispatcher
    name = lyrics
    with-router = false  # Optional, defaults to false
    init-required = true # 告知squbs我們需要在發送所有已經啟動前等待該actor
  }

任何設置init-required為true的actor需要發送一個已完成(報告)消息至cube管理者,即這些well known actor的父actor。這個報告是Try[Option[String]]類型,允許actor報告初始化成功和失?。赡軘y帶異常)。一旦所有的cube成功的初始化完成,運行中的squbs轉變至Active 狀態。這同樣表示每個設置init-required為true的actor提交了初始化成功的報告。如果任何cube報告一個初始化失敗的報告,運行中的squbs會以一個Failed狀態取而代之。

關閉鉤子(Hooks)

停止Actors

特性org.squbs.lifecycle.GracefulStopHelper讓用戶在他們自己的代碼中實現優雅的關閉actor。你可以按如下的方式在你的actor中混合(mix)這個特性(trait):

scala
class MyActor extends Actor with GracefulStopHelper {
    ...
}

這個特性提供了一些幫助方法來支持在squbs框架中優雅的關閉actor

StopTimeout

scala
  /**
   * 優雅的關閉actor的超時時間
   * Override it for customized timeout and it will be registered to the reaper
   * Default to 5 seconds
   * @return Duration
   */
  def stopTimeout: FiniteDuration =
    FiniteDuration(config.getMilliseconds("default-stop-timeout"), TimeUnit.MILLISECONDS)

你可以復寫這個方法來指出優雅的關閉actor所需要執行的大概時間。一旦actor啟動,它將通過 StopTimeout(stopTimeout) 消息將stopTimeout發送至它們的父節點。如果你關心它,你可以在父actor中處理這條信息。

如果你混合(mix)這個特性在你的actor代碼中,你應該在你的receive 方法中接收GracefulStop消息,因為只有在這種情況下你可以勾住你的代碼來執行一個優雅的停止(你無法向PoisonPill添加自定義行為)。管理者將僅僅傳播 GracefulStop 消息至他們那些混合了GracefulStopHelper特性的子節點。子節點的實現應該在他們的receive塊中處理這個消息。

我們還提供了以下兩個默認策略:

  /**
   * Default gracefully stop behavior for leaf level actors
   * (Actors only receive the msg as input and send out a result)
   * towards the `GracefulStop` message
   *
   * Simply stop itself
   */
  protected final def defaultLeafActorStop: Unit = {
    log.debug(s"Stopping self")
    context stop self
  }
  /**
   * Default gracefully stop behavior for middle level actors
   * (Actors rely on the results of other actors to finish their tasks)
   * towards the `GracefulStop` message
   *
   * Simply propagate the `GracefulStop` message to all actors
   * that should be stop ahead of this actor
   *
   * If some actors failed to respond to the `GracefulStop` message,
   * It will send `PoisonPill` again
   *
   * After all the actors get terminated it stops itself
   */
  protected final def defaultMidActorStop(dependencies: Iterable[ActorRef],
                                          timeout: FiniteDuration = stopTimeout / 2): Unit = {

    def stopDependencies(msg: Any) = {
      Future.sequence(dependencies.map(gracefulStop(_, timeout, msg)))
    }

    stopDependencies(GracefulStop).onComplete({
      // all dependencies has been terminated successfully
      // stop self
      case Success(result) => log.debug(s"All dependencies was stopped. Stopping self")
        if (context != null) context stop self

      // some dependencies are not terminated in the timeout
      // send them PoisonPill again
      case Failure(e) => log.warning(s"Graceful stop failed with $e in $timeout")
        stopDependencies(PoisonPill).onComplete(_ => {
          // don't care at this time
          if (context != null) context stop self
        })
    })
  }

停止Squbs插件

通過復寫org.squbs.lifecycle.ExtensionLifecycle中的shutdown()方法,你可以添加在擴展關閉中添加個性化的行為。需要指出的是這個方法在所有安裝好的擴展中將在actor系統停止后執行。如果任何擴展在關閉的時候拋出了異常,JVM會以-1退出。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,732評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,214評論 3 426
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 177,781評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,588評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,315評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,699評論 1 327
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,698評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,882評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,441評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,189評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,388評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,933評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,613評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,023評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,310評論 1 293
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,112評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,334評論 2 377

推薦閱讀更多精彩內容