scala之Akka的Actor模型(上)
阿新 • • 發佈:2019-02-13
原文地址:http://my.oschina.net/jingxing05/blog/287213
明確並行和併發
看兩張圖
並行parallelism
併發concurrency
關鍵點在於 多個任務之間 有沒有 交流和互動的!
交流: 共享記憶體(Lock 訊號量) 訊息驅動 互動:競爭
一段順序的相同程式碼 同時 多份 執行 並行,並行不悖!!!多條車道
而當把這段順序的程式碼再分成幾個獨立的執行小段,對各個小段可以同時執行,併產生交流時
併發 一條道上 多輛車 可以超車
多執行緒是並行的,但不一定是併發的,如果沒有互動
沒有對共享變數的操做,根本無需考慮所謂併發的問題
Actor模型
Actor模型的要點
- 基於Actor的系統中 Actor是最小的抽象單元, 就像object 之於 oop
- 一個Actor封裝了狀態和行為
- 外界不能進入Actor以獲取其狀態、欄位、執行方法,和Actor的互動只能通過message
- 一個Actor有一個信箱mailbox,將外部發送來的訊息msg存到佇列中
- Actor的終生就是在等待msg,並依次取出mailbox中的訊息進行處理
Actor模型的組織觀
- 將Actor系統視為一個公司,從上到下有嚴格的層級關係,公司中員工是person,也是actor
- 一個Actor僅有一個上級主管 稱為 supervisor,就是create這個Actor的 那個Actor
- 一個Actor可能有多個下屬小兵,真正幹著髒累差活的actor
- 一個Actor可能有多個同級的兄弟部門actor
開發actor系統的關鍵
- 委託 委託 委託!!! 以做的更多!
- 公司老總不能事無鉅細全部承擔,他的主要工作就是分配公司工作和監督
- 各部門主管收到任務,要麼自己幹,要麼再細分任務,然後分配到自己的下屬手中並監督
- 如果公司還有更多的層級,則繼續上面這個主管的齷齪勾當
- 最底層的員工收到細粒度任務,幹著自己最擅長的事情
Actor的失效處理
- 人無完人,Actor也不可能100%完成任務
- 如果任務執行失敗,一個Actor會掛起自己及其下屬,然後發訊息告訴其上級主管“我失敗了”!
- 上級主管收到下屬的“失敗”訊息時,可以有如下反應:
- 失敗就失敗,就這樣吧,沒太大關係:保持當前狀態,恢復Actor,繼續工作
- 沒成功啊,那重新做一遍吧 :重置狀態,重啟該Actor
- 沒機會了,失敗了你就滾!解僱下屬:關閉 終結 該 Actor
- 這事我也決定不了,我請示我的上級:向上級Actor報告
Akka實現的Actor模型的一些附加特性
- 例項化一個Actor時,返回一個ActorRef,相當於 郵箱地址,並不能通過這個獲取Actor的狀態資訊
- Actor模型是執行緒的更高層抽象,最終是跑在java的執行緒中的
- 多個Actor可能共享一個執行緒,這是由akka保障的
- Actor的信箱有多種實現方式:無限變數信箱 有限信箱 帶優先順序信箱, 還可以自定義實現
- akka沒有讓Actor掃描信箱的message
- 一個Actor終結(無論是正常還是非常的)它的信箱中的msg進入akka系統的“死信箱dead letter mailbox”中