2017年4月24日

Actor Model

Actor Model 是一個 concurrent computing 的計算模型,Actor 是這個模型的基本計算單元,當 actor 透過一個自己的獨立 mailbox 接收到一個訊息,他能夠根據這個訊息,做出決策、進行運算、產生其他訊息、決定如何回應。

Actor model 是 1973 年由Carl Hewitt、Peter Bishop及Richard Steiger的論文: A Universal Modular Actor Formalism for Artificial Intelligence 提出。

在當時由於機器多屬於單核心且網路速度較慢,不同的 actor 甚至是遠端的 actor 之間發送訊息,存在著明顯的資料延遲時間。但由於 Moore's Law 的趨勢,目前的 CPU 已經是多核心的時代,網路速度也已經不可同日而語,以往的資料鎖定 (lock) 方法已經無法滿足於現今處理並行運算的硬體設備。Actor Model 簡化了 data lock 的實作的複雜性,去掉了 deadlock 的問題,在一個運算環境中以大量的actor 小單元完成並行運算的工作。


Everything's an Actor

相對於物件導向的 Everything is an Object,Actor Model 認為 Everything is an Actor。actors 是一個並行的運算系統,能夠處理下列的工作,這是 actor 的基本原則。

  1. 傳送有限數量的訊息給其他 actors
  2. 建立有限數量的 new actors
  3. 指定接受到下一個訊息時的行為

所有訊息的收送都是非同步的,透過 mail address 傳送資料。每一個 actor 都有一個 mailbox ,以 FIFO 方式暫存接收到的訊息。

Actor Model 的爸爸 Carl Hewitt 在 Lang.NEXT 2012 針對 acotr model 有一段討論會形式的說明 Hewitt, Meijer and Szyperski: The Actor Model (everything you wanted to know...),整個影片的過程就像是聊天一樣,3 個 actors 在互相溝通與討論 actor model。

實作 actor 有三個原則,必須要包含下面三種基本要素

  1. processing: 要能進行運算
  2. storage: 必須要能儲存資料
  3. communication: 要能跟其他 actors 溝通

actor 就像是一個獨立的個體,他能持續的接收訊息,進行工作,但同一時間內,只能處理一個訊息,所有訊息都是依照收到的順序依次進行處理。

當 actor 互相傳送訊息,可能透過某種方式發送訊息給自己,這有可能會造成 deadlock 嗎?

Carl Hewitt 給了使用 Futures and promises 的概念,因為 future 就像是在現在預約一個在未來會產生結果的訊息,因此 actor 可以產生一個 future,並發送給自己的 address,然後在收到自己發送的訊息時,進行下一步的運算,並將結果放到 future 裡面,這完全不可能會造成 deadlock。

address 跟 actor 本身並不是一對一的,而是多對多的,一個 actor 可以有多個 addresses,一個 address 也可能因為原本的 actor 失效,而指向到另一個重新產生的 actor,address 並不代表是 actor 的 identity。

actor 因為一次處理一個訊息的特性,因此不會造成資料同步上的問題,基本上資料只存在於這個 actor 裡面,一次又只能因為一個訊息的輸入及運算,而異動了這個資料,因此不會造成資料同步上的問題。

AKKA NOTES - INTRODUCING ACTORS 這篇文章用了幾張圖片,說明 actor 之間如何互相傳送資料,Actor 就像是一群人,他們互相之間不會面對面地交流,而只是通過郵件的方式進行溝通。

傳遞消息是Actor模型的基礎,他以一名學生和一位教師舉例,描述了以下基礎流程:

  1. 一名學生給一位教師發送了一封郵件,郵件一旦發送之後,就不能夠修改了
  2. 教師會在她認為適合的時機去檢查她的郵箱,收到這封郵件
  3. 該教師稍後會寄一封回信給該學生,這封回信也是一旦發送就不可修改的
  4. 學生在一段時間後決定去檢查一下他的郵箱,收到了回信

信件是單向的,那麼它一旦送出之後並不會期待或等待任何響應,但 actor 都能夠在一個 request-response 週期內,為發送者發送回應消息。

Scratch 也使用了 Actor Model

Actor Model 中列出了現在支援了 Actor Model 的程式語言,其中有一個特別的是 Scratch,Scratch 是 MIT 為了小朋友開發的一套圖形介面的程式設計軟體,適合從來沒有學過程式設計的小朋友,通過拖曳預先設定好的積木式程式模件,堆疊出指令,設定或控制角色及背景的行動和變化,從而完成程式設計。

參考這個範例 Scratch 教學的第 1 堂課(1/5)適合親子共學的兒童程式設計入門,如果有用過 Scratch,也會知道在開發時,一開始就是要產生人物的主角,然後再程式區塊,產生數個 blocks,為每個 block 設定 trigger 該 block 的事件條件,當滿足該條件時,就持續下去進行下面程式區塊的運算,也可以在運算後,廣播一個訊息,驅動其他的程式區塊。

這跟 Actor Model 的概念是很接近的,執行時也可以發現,這些程式區塊是可以同時進行運算的,程式區塊之間,也可以透過訊息的發送傳遞消息,不過 scratch 還是支援了全域變數,這跟 actor model 本身就有些不同,但這畢竟是給小朋友使用的工具,因為變數的概念對學程式來說是一個門檻,如果變數沒有辦法共享,coding 就沒辦法那麼直覺地使用變數。

References

Akka in action: actor model

以Akka為示例,介紹Actor模型 I