Akka理論總結__ Akka
來源:互聯網
上載者:User
AKKA 是一款基於actor模型實現的並發處理架構。基於事件驅動的並發處理模型,每一個actor擁有自己的屬性和操作,這樣就避免了通常情況下因為多個線程之間要共用屬性(資料)而是用鎖機制的處理。這種機制在scala,cloure 語言中應用的很好,將操作和屬性放在一個獨立的單元中進行處理,從而提高並發處理的能力。
Akka的五大特性
1)易於構建並行和 分布式應用 (Simple Concurrency & Distribution)
Akka在設計時採用了非同步通訊和分布式架構,並對上層進行抽象,如Actors、Futures ,STM等。
2)可靠性(Resilient by Design)
系統具備自愈能力,在本地/遠程都有監護。
3)高效能(High Performance)
在單機中每秒可發送50000000個訊息。記憶體佔用小,1GB記憶體中可儲存2500000個actors。
4)彈性,無中心(Elastic — Decentralized)
自適應的負責均衡,路由,分區,配置
5)可擴充(Extensible) 可以使用Akka 擴充包進行擴充。
階層 和商業組織(比如公司)類型,Actors之間也具有階層,一個Actor可以負責程式的某個功能,可以需要把分配給它的任務分成更小的便於管理的小任 務。因此一個actor可以建立多個子Actor來完成這些小任務,並負責管理它們。每個Actor有且只有一個管理者(supervisor)。
Actor 系統的一個精髓是可以把一個複雜的任務分解成小的可以處理的問題。這樣做的好處是不僅僅任務本身結構清晰,而且用來處理它的Actor的訊息也可以很好的進行分析,如果某個Actor不能處理某些情況,它可以給它的管理員發送失敗訊息,請求協助。這種逐級上報的結構支援在適當的層次來處理錯誤。 我們在定義一個Actor時最好符合下面一些規則: 1)Actors應當是一個好同事,高效的完成自身的問題而不給別的Actor造成不必要的麻煩和不過分佔用資源。使用編程的術語來說,就是使用事件處理的方式來處理事件並返回結果。Actor不該阻塞某些外部實體(比如一個鎖,網路連接埠) 2)不要在Actor之間傳遞可以變化的資料,因此優先使用狀態不變的訊息。 3)Actor可以儲存某些狀態,並定義了一些功能,這意味著不同時傳遞資料和處理這些資料的行為。 最上層的Actor應該是你處理錯誤的最核心的那一層,因此不要過多的建立最上層的Actor,優先考慮純等級結構。
仔細管理阻塞操作 如果某些可能造成阻塞的操作無法避免,比如在需要等待某些外部條件發生時使線程進入睡眠狀態(比如網路操作時),在處理這些情況下,你可能非常想使用Future來封裝這些阻塞操作,但這種方法過於簡單化,你可能很快發現瓶頸或者記憶體不足等現象。
這裡給出一個可以用來解決這個問題的解決方案的不完全列表: 1)在一個actor中完成這個阻塞操作,並且確保使用一個線程池專門來完成這項操作。 2)使用一個Future來完成這個阻塞操作,給出可以同時處理這個操作的數目的上界。 3)使用一個Future來完成這個阻塞操作,並使用一個定義了上界的線程池。 4)專門定義一個線程來管理一組可能被阻塞的資源,然後在事件發生時由它給Actor分發訊息。
Actors模型 Actor模型並非什麼新鮮事物,它由Carl Hewitt於上世紀70年代早期提出,目的是為瞭解決分布式編程中一系列的編程問題。其特點如下:
系統中的所有事物都可以扮演一個Actor
Actor之間完全獨立
在收到訊息時Actor所採取的所有動作都是並行的,在一個方法中的動作沒有明確的順序
Actor由標識和當前行為描述
Actor可能被分成原始(primitive)和非原始(non primitive)類別 很多開發語言都提供了原生的Actor模型。例如erlang,scala等 Actor,可以看作是一個個獨立的實體,他們之間是毫無關聯的。但是,他們可以通過訊息來通訊。一個Actor收到其他Actor的資訊後,它可以根據 需要作出各種相應。訊息的類型可以是任意的,訊息的內容也可以是任意的。這點有點像webservice了。只提供介面服務,你不必瞭解我是如何?的。 一個Actor如何處理多個Actor的請求呢。它先建立一個訊息佇列,每次收到訊息後,就放入隊列,而它每次也從隊列中取出訊息體來處理。通常我們都使得這個過程是迴圈的。讓Actor可以時刻處理髮送來的訊息。
Actor訊息
Actor發送訊息方式 1)fire and forget方式:tell。 2)send and receive方式:ask。阻塞,會等待子actor返回Future。
在akka裡, Future表示一個非同步任務,這個非同步任務的執行由system.dispatcher()得到的ExecutionContextExecutor執行。 scheduler表示一個調度任務。