1. 程式人生 > >Akka 實踐(一)Akka基礎

Akka 實踐(一)Akka基礎

Actor之間通過傳送訊息來通訊,訊息的傳送是非同步的,通過一個郵件佇列(mail queue)來處理訊息。每個Actor是完全獨 立的,可以同時執行它們的操作。每一個Actor是一個計算實體,對映接收到的訊息到以下動作:

1、傳送有限個訊息給其它Actor;
2、建立有限個新的Actor;
3、為下一個接收的訊息指定行為。
  以上三種動作並沒有固定的順序,可以併發地執行。Actor會根據接收到的訊息進行不同的處理。在一個Actor系統中,包含一個未處理的任務集,每一個任務由以下三個屬性標識:
1、tag:用以區別於系統中的其它任務;
2、target:通訊到達的地址;
3、communication:包含在target上的Actor處理任務時可獲取的資訊,。
  簡單起見,可以把一個任務視為一個訊息,在Actor之間傳遞包含以上三個屬性的值的訊息。Actor模型有兩種任務排程方式:基於執行緒的排程以及基於事件的排程:
基於執行緒的排程:為每個Actor分配一個執行緒,在接收一個訊息時,如果當前Actor的郵箱(mail box)為空,則會阻塞當前執行緒。基於執行緒的排程實現較為簡單,但執行緒數量受到操作的限制,現在的Actor模型一般不採用這種方式;
基於事件的除錯:事件可以理解為上述任務或訊息的到來,而此時才會為Actor的任務分配執行緒並執行。
   綜上,我們知道可以把系統中的所有事物都抽象成一個Actor:
1、Actor的輸入是接收到的訊息。
        2、Actor接收到訊息後處理訊息中定義的任務。
        3、Actor處理完成任務後可以傳送訊息給其它的Actor。
  那麼在一個系統中,可以將一個大規模的任務分解為一些小任務,這些小任務可以由多個Actor併發處理,從而減少任務的完成時間。AKKA採用actor 模型來讓開發者不需要關注太多併發,同步問題。

AKKA基於jvm執行,底層是擺脫不了執行緒池執行,akka也少不了執行緒池大小配置的煩惱。但是Actor與thread不是一個維度的事情,Actor比thread更抽象,更偏上層,它只是定義了一種機制。
Actors 是一些包含狀態和行為的一些物件。它們通過顯式的傳遞訊息來進行通訊,這些訊息會被髮送到它們收件箱中(訊息佇列)。某種意義上來說,actor 是面向物件程式設計中最嚴格的實現形式。為了更好的理解它們,我們可以把這些actors看做一群人。想象一下,我們把一些子任務分給一群人,這些人根據其不同的職能劃分為不同的組織機構。(這樣的好處就是我們不用與實際的人去打交道,而是直接面對部門整體。也不用花心思去考慮某一個人的情緒因素和職業道德了)。我們在構建軟體的時候其實也可以借鑑這種方式。