標籤:
原文連結:http://blog.jeoygin.org/archives/477
Actor這個模型由Carl Hewitt在1973年提出,Gul Agha在1986年發表技術報告“Actors: A Model of Concurrent Computation in Distributed Systems”,至今已有不少年頭了。在電腦科學中,它是一個並行計算的數學模型,最初為由大量獨立的微處理器組成的高並行電腦所開發,Actor模型的理念非常簡單:天下萬物皆為Actor。
Actor之間通過發送訊息來通訊,訊息的傳送是非同步,通過一個郵件隊列(mail queue)來處理訊息。每個Actor是完全獨立的,可以同時執行它們的操作。每一個Actor是一個計算實體,映射接收到的訊息到以下動作:
- 發送有限個訊息給其它Actor;
- 建立有限個新的Actor;
- 為下一個接收的訊息指定行為。
以上三種動作並沒有固定的順序,可以並發地執行。Actor會根據接收到的訊息進行不同的處理。
在一個Actor系統中,包含一個未處理的任務集,每一個任務由以下三個屬性標識:
- tag:用以區別於系統中的其它任務;
- target:通訊到達的地址;
- communication:包含在target上的Actor處理任務時可擷取的資訊,。
簡單起見,可以把一個任務視為一個訊息,在Actor之間傳遞包含以上三個屬性的值的訊息。
Actor模型有兩種任務調度方式:基於線程的調度以及基於事件的調度:
- 基於線程的調度:為每個Actor分配一個線程,在接收一個訊息時,如果當前Actor的郵箱(mail box)為空白,則會阻塞當前線程。基於線程的調度實現較為簡單,但線程數量受到操作的限制,現在的Actor模型一般不採用這種方式;
- 基於事件的調試:事件可以理解為上述任務或訊息的到來,而此時才會為Actor的任務分配線程並執行。
綜上,我們知道可以把系統中的所有事物都抽象成一個Actor:
- Actor的輸入是接收到的訊息。
- Actor接收到訊息後處理訊息中定義的任務。
- Actor處理完成任務後可以發送訊息給其它的Actor。
那麼在一個系統中,可以將一個大規模的任務分解為一些小任務,這些小任務可以由多個Actor並發處理,從而減少任務的完成時間。
舉個簡單的例子,比如現在要在3台物理節點上運行一個WordCount作業,可以將這個作業細分為Split、Count和Merge三種任務(任務的target是物理節點的地址,communication可能包含文本、單詞及計數等),根據需求要有Split Actor、Count Actor和Merge Actor。整個作業的處理流程以下:
- Split Actor接收到訊息後可以文本分割成10份,每份發送給一個Count Actor;
- Count Actor統計好單詞的數目後發送訊息給Merge Actor;
- Merge Actor收集完Count Actor發送的10個訊息後,合并每個單詞的數目,完成WordCount任務。
從以上例子可以看出,Actor系統跟資料驅動系統比如資料流相近,可以自訂任務的流向及其處理過程。Actor模型被廣泛使用在很多並發系統中,比如Email、Web Service等等。
參考資料
(1) G. Agha, Actors: A Model of Concurrent Computation in Distributed Systems. Cambridge, MA, SA: MIT Press,1986.
(2) Wikipedia: http://en.wikipedia.org/wiki/Actor_model
(3) ActorLite:一個輕量級Actor模型實現(上)
Actor模型[轉]