1. 程式人生 > >scala之Akka的Actor模型(上)

scala之Akka的Actor模型(上)

原文地址:http://my.oschina.net/jingxing05/blog/287213

明確並行和併發

看兩張圖

並行parallelism

gophersimple4

併發concurrency

gophercomplex0

關鍵點在於 多個任務之間 有沒有 交流和互動的!

交流: 共享記憶體(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會掛起自己及其下屬,然後發訊息告訴其上級主管“我失敗了”!
  • 上級主管收到下屬的“失敗”訊息時,可以有如下反應:
    1. 失敗就失敗,就這樣吧,沒太大關係:保持當前狀態,恢復Actor,繼續工作
    2. 沒成功啊,那重新做一遍吧             :重置狀態,重啟該Actor
    3. 沒機會了,失敗了你就滾!解僱下屬:關閉 終結 該 Actor
    4. 這事我也決定不了,我請示我的上級:向上級Actor報告

Akka實現的Actor模型的一些附加特性

  • 例項化一個Actor時,返回一個ActorRef,相當於 郵箱地址,並不能通過這個獲取Actor的狀態資訊
  • Actor模型是執行緒的更高層抽象,最終是跑在java的執行緒中的
  • 多個Actor可能共享一個執行緒,這是由akka保障的
  • Actor的信箱有多種實現方式:無限變數信箱    有限信箱    帶優先順序信箱, 還可以自定義實現
  • akka沒有讓Actor掃描信箱的message
  • 一個Actor終結(無論是正常還是非常的)它的信箱中的msg進入akka系統的“死信箱dead letter mailbox”中