成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Akka 使用系列之三: 層次結(jié)構(gòu)

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

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

Akka

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.  
  7.     def receive = { 
  8.         case eng1:String =>
  9.             english2chinese ! eng1 
  10.             english2cat     ! eng1 
  11.         } 
  12.     } 
  13.  
  14. class English2Chinese extends Actor with ActorLogging{ 
  15.     def receive = { 
  16.         case eng:String => { 
  17.             println("我翻譯不出來!") 
  18.         } 
  19.     } 
  20.  
  21. class English2Cat extends Actor with ActorLogging{ 
  22.     def receive = { 
  23.         case eng:String =>
  24.              println( "喵喵喵!") 
  25.         } 
  26.     } 
  27.  
  28. object Main{ 
  29.     def main(args:Array[String])={ 
  30.         val sys = ActorSystem("system") 
  31.         val master = sys.actorOf(Props[Master],"Master") 
  32.         master ! "Hello,world!" 
  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 的消息就會(huì)被轉(zhuǎn)送到 deadLetterListener。因此完整的 Actor 層次結(jié)構(gòu)如下所示。

完整的 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í)行停止動(dòng)作 (即停止該子 Actor)。

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

Akka 的監(jiān)控策略一共支持四種動(dòng)作: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)動(dò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.  
  7.   override val supervisorStrategy  
  8.   = OneForOneStrategy(){ 
  9.     case _:Exception => Stop 
  10.   } 
  11.  
  12.   override def receive = { 
  13.     case eng:String => { 
  14.       english2Cat ! eng; 
  15.       english2Chinese ! eng; 
  16.      } 
  17.   } 
  18.  
  19. class English2Chinese1 extends Actor with ActorLogging{ 
  20.   override def receive = { 
  21.     case eng:String => { 
  22.       println("翻譯不出來") 
  23.     } 
  24.   } 
  25.  
  26. class English2Cat1 extends Actor with ActorLogging{ 
  27.   override def receive = { 
  28.     case eng:String => { 
  29.       throw new Exception("Exception in English2Cat1") 
  30.     } 
  31.   } 
  32.  
  33. object hierarchy1 { 
  34.   def main(args:Array[String])={ 
  35.     val system  
  36.     = ActorSystem("system") 
  37.     val master 
  38.     = system.actorOf(Props[Master1],"Master") 
  39.  
  40.     master ! "Hello, world" 
  41.     Thread.sleep(1000) 
  42.     master ! "Hello, world" 
  43.   } 

運(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í)行動(dòng)作。

  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.  
  7.   override val supervisorStrategyAllForOneStrategy() { 
  8.     case _: Exception => Stop 
  9.   } 
  10.  
  11.   override def receive = { 
  12.     case eng:String => { 
  13.       english2Cat ! eng; 
  14.       english2Chinese ! eng; 
  15.      } 
  16.   } 

運(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ī)制保障。

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

戳這里,看該作者更多好文

責(zé)任編輯:趙寧寧 來源: 51CTO專欄
相關(guān)推薦

2017-06-15 13:29:12

AkkaSpark異步

2011-06-14 10:35:15

性能優(yōu)化

2018-04-17 15:26:44

物聯(lián)網(wǎng)發(fā)展趨勢互聯(lián)網(wǎng)

2009-06-02 14:28:14

品牌故事APC

2011-11-03 11:42:42

虛擬化vmwareVMware View

2010-07-09 09:37:00

HART協(xié)議

2009-09-05 13:02:17

IT職業(yè)規(guī)劃孔文達(dá)

2009-09-22 13:11:01

ibmdwSOA

2015-10-30 15:30:54

LevelDBSSTableSybase

2013-12-02 14:13:54

jQueryUI

2010-07-06 10:19:15

SQL Server層

2024-04-09 08:07:00

遞歸查詢MySQL數(shù)據(jù)庫

2019-07-30 12:36:10

云計(jì)算微軟亞馬遜

2021-02-22 14:04:47

Vue框架項(xiàng)目

2019-09-28 23:17:41

zabbix運(yùn)維監(jiān)控

2021-02-04 07:22:07

NPOI操作Excel

2011-06-24 16:26:20

SEO

2012-03-15 17:18:33

JavaHashMap

2012-02-15 10:37:38

JavaJava Socket

2009-06-14 17:08:14

ibmdwWebSphere
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 激情五月激情综合网 | 成人在线观看免费 | 久久一| 天堂免费 | 久久av一区二区三区 | 国产精品区二区三区日本 | 国产精品一区二区三区在线 | 福利视频网站 | 国产精品久久久久久久久久久久久 | 久久久久亚洲 | 久久久精品影院 | 亚洲一区在线播放 | 凹凸日日摸日日碰夜夜 | 亚洲精品一级 | 欧美日韩精品中文字幕 | 激情一区二区三区 | 99精品国产一区二区三区 | 国产在线精品一区二区三区 | 亚洲一二视频 | 精品蜜桃一区二区三区 | 国产视频久久 | a免费视频| 成人深夜小视频 | 一级免费毛片 | 99国产视频 | 国产日韩免费视频 | 亚洲国产精品日韩av不卡在线 | 日韩在线观看一区二区三区 | 精品久久久久国产免费第一页 | 精品一区av| 中文字幕电影在线观看 | 一区二区三区免费观看 | 欧美性久久 | 亚洲视频区 | 一级毛片免费完整视频 | 农夫在线精品视频免费观看 | 中日韩欧美一级片 | 国产中文一区二区三区 | 日日骚网 | 中文欧美日韩 | 国产伦精品一区二区三区精品视频 |