Actors模型(Actor model)首先是由Carl Hewitt在1973定義, 由Erlang OTP (Open Telecom Platform) 推廣,其 消息傳遞更加符合面向對象的原始意圖。 Actors屬於併發組件模型 ,經過組件方式定義併發編程範式的高級階段,避免使用者直接接觸多線程併發或線程池等基礎概念。html
傳統多數流行的語言併發是基於多線程之間的共享內存,使用同步方法防止寫爭奪,Actors使用消息模型,每一個Actors在同一時間處理最多一個消息,能夠發送消息給其餘Actors,保證了單獨寫原則 。從而巧妙避免了多線程寫爭奪。java
Actors模型的特色是:react
AKKA框架是一個實現Actors模型的Scala或Java平臺,靈感來自ERlang,能更輕鬆地開發可擴展,實現多線程安全應用。編程
Actors是一個輕量級的對象,經過發送消息實現交互。每一個Actors在同一時間處理最多一個消息,能夠發送消息給其餘Actors。在同一時間能夠於一個Java虛擬機存在數以百萬計的參與者,構架是一個分層的父層(管理) - 子層,其中父層監控子層的行爲。還能夠很容易地擴展Actor運行在集羣中各個節點之間 - 無需修改一行代碼。每一個演員均可以有內部狀態(字段/變量) ,但通訊只能經過消息傳遞,不會有共享數據結構(計數器,隊列) 。Akka框架支持兩種語言Java和Scala,安全
WhatsApp成功背後的Erlang語言
Actor模型和CSP模型的區別
高級併發:Akka Actors和JavaEE7的EJB比較
Akka教程
AKKA框架介紹
使用Akka發送1000萬消息
使用Akka實現MapReduce的單詞計數
Akka+ZeroMQ消息生產者和消費者
軟件事務內存STM
RXJAVA的Observable和AKKA ACTOR綜合使用
爲何Actor模型是高併發事務的終極解決方案?
actor併發模型&基於共享內存線程模型
Spray + Akka高性能異步IO併發
使用Scala的Akka HTTP,Akka Stream和Reactive Mongo創建REST服務服務器
單獨寫原則
LMAX架構
go reactive宣言
Scala入門之函數編程
Scala入門之基本概念
vertx入門教程
使用Kafka和ZeroMQ實現分佈式Quasar Actor
Actors模型更多專題
AKKA更多專題
reactive編程
Scala專題
Disruptor專題
併發編程
性能專題
EDA事件驅動專題
過去十幾年CPU一直遵循着摩爾定律發展,單核頻率愈來愈快,可是最近這幾年,摩爾定律已然失效,CPU的工藝製程和發熱穩定性之間難以取捨,取而代之的策略則是增長核心數量,目前家用電腦四核已經很是常見,服務器更是達到了32核64線程。爲了有效地利用多核CPU,咱們在代碼層面就應該考慮到併發性。十幾年的痛苦開發經歷告訴咱們,threads並非獲取併發性的好方法,每每會帶來難以查找的bug,可是不用懼怕,今天咱們有不少其餘方法來得到易用的併發性,好比咱們接下來介紹的Actor模型。數據結構
模型 Model
Actor模型是一個概念模型,用於處理併發計算。它定義了一系列系統組件應該如何動做和交互的通用規則,最著名的使用這套規則的編程語言是Erlang。這篇文章更關注模型自己而不是它在不一樣語言的實現。多線程
Actors
一個Actor指的是一個最基本的計算單元。它能接收一個消息而且基於其執行計算。架構
這個理念很像面嚮對象語言,一個對象接收一條消息(方法調用),而後根據接收的消息作事(調用了哪一個方法)。併發
Actors一大重要特徵在於actors之間相互隔離,它們並不互相共享內存。這點區別於上述的對象。也就是說,一個actor能維持一個私有的狀態,而且這個狀態不可能被另外一個actor所改變。
積少成多
One ant is no ant, one actor is no actor.
光有一個actor是不夠的,多個actors才能組成系統。在actor模型裏每一個actor都有地址,因此它們纔可以相互發送消息。Actors有郵箱
只得指明的一點是,儘管許多actors同時運行,可是一個actor只能順序地處理消息。也就是說其它actors發送了三條消息給一個actor,這個actor只能一次處理一條。因此若是你要並行處理3條消息,你須要把這條消息發給3個actors。
消息異步地傳送到actor,因此當actor正在處理消息時,新來的消息應該存儲到別的地方。Mailbox就是這些消息存儲的地方。
Actors作什麼
當一個actor接收到消息後,它能作以下三件事中的一件:
- Create more actors; 建立其餘actors
- Send messages to other actors; 向其餘actors發送消息
- Designates what to do with the next message. 指定下一條消息到來的行爲
前兩件事比較直觀,第三件卻頗有意思。
我以前說過一個actor能維持一個私有狀態。「指定下一條消息來到作什麼」意味着能夠定義下條消息來到時的狀態。更清楚地說,就是actors如何修改狀態。
設想有一個actor像計算器,它的初始狀態是數字0。當這個actor接收到
add(1)
消息時,它並不改變它本來的狀態,而是指定當它接收到下一個消息時,狀態會變爲1。容錯 Fault tolerance
Erlang 引入了「隨它崩潰」的哲學理念,這部分關鍵代碼被監控着,監控者的惟一職責是知道代碼崩潰後幹什麼(如將這個單元代碼重置爲正常狀態),讓這種理念成爲可能的正是actor模型。
每段代碼都運行在process中,process是erlang稱呼actor的方式。這個process徹底獨立,意味着它的狀態不會影響其餘process。咱們有個supervisor,實際上它只是另外一個process(全部東西都是actor),當被監控的process掛了,supervisor這個process會被通知並對此進行處理。這就讓咱們能建立「自愈」系統了。若是一個actor到達異常狀態並崩潰,不管如何,supervisor均可以作出反應並嘗試把它變成一致狀態,這裏有不少策略,最多見的是根據初始狀態重啓actor。
分佈式 Distribution
另外一個關於actor模型的有趣方面是它並不在乎消息發送到的actor是本地的或者是另外節點上的。
轉念一想,若是actor只是一些代碼,包含了一個mailbox和一個內部狀態,actor只對消息作出響應,誰會關注它運行在哪一個機器上呢?只要咱們能讓消息到達就好了。這容許咱們基於許多計算機上構建系統,而且恢復其中任何一臺。
進一步瞭解
這裏是一個快速的概念模型回顧,其中的概念被運用到許多知名語言和庫中,好比Erlang和Elixir, Akka (for the JVM) 和 Celluloid (for Ruby)。
若是你想更深刻了解actor及其背後的原理,你能夠進一步閱讀下面書籍和文章:
- Seven Concurrency Models in Seven Weeks: When Threads Unravel
- Programming Elixir
- Elixir in Action
- Actor模型
- 爲何Actor模型是高併發事務的終極解決方案?
這個視頻比較完整地討論了Actor的概念模型。
The Actor Model (everything you wanted to know)Scala或Erlang的進程信箱都是一種Actor模型,也有Java的專門的Actor模型,這裏是幾種Actor模型比較明白了Actor模型原理,使用Disruptor這樣無鎖隊列也能夠本身實現Actor模型,讓一個普通對象與外界的交互調用經過Disruptor消息隊列實現,好比LMAX架構就是這樣實現高頻交易,從2009年成功運行至今,被Martin Fowler推崇。
做者:時見疏星連接:https://www.jianshu.com/p/449850aa8e82來源:簡書著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。