日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Akka使用系列之三:層次結(jié)構(gòu)

Akka 是用層次結(jié)構(gòu)組織 Actors 的。

1. Akka 的層次結(jié)構(gòu)

我們需要實(shí)現(xiàn)一個(gè)翻譯模塊,其功能是輸入中文輸出多國語言。我們可以讓一個(gè) Master Actor 負(fù)責(zé)接收外界輸入,多個(gè) Worker Actor 負(fù)責(zé)將輸入翻譯成特定語言,Master Actor 和 Worker Actor 之間是上下級層次關(guān)系。下圖展示了這種層級結(jié)構(gòu)。

具體代碼實(shí)現(xiàn)如下所示。

 
 
 
 
  1. class Master extends Actor with ActorLogging{
  2.     val english2chinese 
  3.     = context.actorOf(Props[English2Chinese],"English2Chinese")
  4.     val english2cat     
  5.     = context.actorOf(Props[English2Cat],"English2Cat")
  6.     def receive = {
  7.         case eng1:String =>{
  8.             english2chinese ! eng1
  9.             english2cat     ! eng1
  10.         }
  11.     }
  12. }
  13. class English2Chinese extends Actor with ActorLogging{
  14.     def receive = {
  15.         case eng:String => {
  16.             println("我翻譯不出來!")
  17.         }
  18.     }
  19. }
  20. class English2Cat extends Actor with ActorLogging{
  21.     def receive = {
  22.         case eng:String =>{
  23.              println( "喵喵喵!")
  24.         }
  25.     }
  26. }
  27. object Main{
  28.     def main(args:Array[String])={
  29.         val sys = ActorSystem("system")
  30.         val master = sys.actorOf(Props[Master],"Master")
  31.         master ! "Hello,world!"
  32.     }
  33. }

我們在 Master Actor 中使用 context.actorOf 實(shí)例化 English2Chinese 和 English2Cat,便可以在它們之間形成層次關(guān)系。這點(diǎn)通過它們的 actor 地址得到證實(shí)。

上面的 Actors 層次結(jié)構(gòu)是我們程序里 Actor 的層次結(jié)構(gòu)。這個(gè)層次結(jié)構(gòu)是 Actor System 層次結(jié)構(gòu)的一部分。Actor System 層次結(jié)構(gòu)從根節(jié)點(diǎn)出來有兩個(gè)子節(jié)點(diǎn):UserGuardian 和 SystemGuardian。用戶程序產(chǎn)生的所有 Actor 都在 UserGuardian 節(jié)點(diǎn)下,SystemGuardian 節(jié)點(diǎn)則包含系統(tǒng)中的一些 Actor,比如 deadLetterListener。如果一個(gè) Actor 已經(jīng) stop 了,發(fā)送給這個(gè) Actor 的消息就會被轉(zhuǎn)送到 deadLetterListener。因此完整的 Actor 層次結(jié)構(gòu)如下所示。

2. Akka 的容錯(cuò)機(jī)制

對于分布式系統(tǒng)來說,容錯(cuò)機(jī)制是很重要的指標(biāo)。那么 Akka 是怎么實(shí)現(xiàn)容錯(cuò)的呢?Akka 的容錯(cuò)機(jī)制是基于層次結(jié)構(gòu): Akka 在 Actor 加一個(gè)監(jiān)控策略,對其子 Actor 進(jìn)行監(jiān)控。下面的代碼是給 Actor 加了一個(gè)監(jiān)控策略,其監(jiān)控策略內(nèi)容:如果子 Actor 在運(yùn)行過程中拋出 Exception,對該子 Actor 執(zhí)行停止動作 (即停止該子 Actor)。

 
 
 
 
  1. override val supervisorStrategy 
  2. = OneForOneStrategy(){
  3.     case _:Exception => Stop
  4. }

Akka 的監(jiān)控策略一共支持四種動作:Stop, Resume, Restart 和 Escalate。

  1. Stop:子 Actor 停止。
  2. Resume:子 Actor 忽略引發(fā)異常的消息,繼續(xù)處理后續(xù)消息。
  3. Restart:子 Actor 停止,重新初始化一個(gè)子 Actor 處理后續(xù)消息
  4. Escalate:錯(cuò)誤太嚴(yán)重,自己已經(jīng)無法處理,將錯(cuò)誤信息上報(bào)給父 Actor。

Akka 的監(jiān)控策略分為兩種。一種是 OneForOne。這種策略只對拋出 Exception 的子 Actor 執(zhí)行相應(yīng)動作。還是拿上面的翻譯模塊做例子,我們加入一個(gè) OneForOne 的 Stop 的監(jiān)控策略。

 
 
 
 
  1. class Master1 extends Actor with ActorLogging{
  2.   val english2Chinese=  
  3.   context.actorOf(Props[English2Chinese1],"English2Chinese")
  4.   val english2Cat = 
  5.   context.actorOf(Props[English2Cat1], "English2Cat")
  6.   override val supervisorStrategy 
  7.   = OneForOneStrategy(){
  8.     case _:Exception => Stop
  9.   }
  10.   override def receive = {
  11.     case eng:String => {
  12.       english2Cat ! eng;
  13.       english2Chinese ! eng;
  14.      }
  15.   }
  16. }
  17. class English2Chinese1 extends Actor with ActorLogging{
  18.   override def receive = {
  19.     case eng:String => {
  20.       println("翻譯不出來")
  21.     }
  22.   }
  23. }
  24. class English2Cat1 extends Actor with ActorLogging{
  25.   override def receive = {
  26.     case eng:String => {
  27.       throw new Exception("Exception in English2Cat1")
  28.     }
  29.   }
  30. }
  31. object hierarchy1 {
  32.   def main(args:Array[String])={
  33.     val system 
  34.     = ActorSystem("system")
  35.     val master
  36.     = system.actorOf(Props[Master1],"Master")
  37.     master ! "Hello, world"
  38.     Thread.sleep(1000)
  39.     master ! "Hello, world"
  40.   }
  41. }

運(yùn)行這段代碼,我們得到下面結(jié)果。從下面的結(jié)果,我們可以看出:***輪 English2Cat1 拋出了 Exception, English2Chinese1 正常工作;第二輪,English2Cat1 已經(jīng)死了,English2Chinese1 也已經(jīng)死亡了。這個(gè)結(jié)果說明監(jiān)控策略已經(jīng)將 MasterActor 的所有子 Actor 停止了。

另一種是 AllForOne。如果有子 Actor 拋出 Exception,這種監(jiān)控策略對所有子 Actor 執(zhí)行動作。

 
 
 
 
  1. class Master2 extends Actor with ActorLogging{
  2.   val english2Chinese 
  3.   = context.actorOf(Props[English2Chinese2],"English2Chinese")
  4.   val english2Cat     
  5.   = context.actorOf(Props[English2Cat2], "English2Cat")
  6.   override val supervisorStrategy= AllForOneStrategy() {
  7.     case _: Exception => Stop
  8.   }
  9.   override def receive = {
  10.     case eng:String => {
  11.       english2Cat ! eng;
  12.       english2Chinese ! eng;
  13.      }
  14.   }
  15. }

運(yùn)行這段代碼,我們得到下面結(jié)果。從下面的結(jié)果,我們可以看出:***輪 English2Cat1 拋出了 Exception, English2Chinese1 正常工作;第二輪,English2Cat1 已經(jīng)死了,English2Chinese1 也已經(jīng)死亡了。這個(gè)結(jié)果說明監(jiān)控策略已經(jīng)將 MasterActor 的所有子 Actor 停止了。

3. 總結(jié)

我們使用 Akka 開發(fā)并行程序時(shí),可以使用層級結(jié)構(gòu)組織 Actors。層次結(jié)構(gòu)不僅比較符合人類直覺,還為容錯(cuò)提供了機(jī)制保障。

【本文為專欄作者“李立”的原創(chuàng)稿件,轉(zhuǎn)載請通過獲取聯(lián)系和授權(quán)】


網(wǎng)站名稱:Akka使用系列之三:層次結(jié)構(gòu)
文章起源:http://m.5511xx.com/article/dhssiog.html