一、背景
????????大型服務(wù)系統(tǒng)由于業(yè)務(wù)或功能的復(fù)雜性,為了維護(hù)和升級的便利,往往在架構(gòu)上按對系統(tǒng)進(jìn)行拆分,按不同功能拆分成不同的子服務(wù),并進(jìn)行分布式的部署。但在我們的實(shí)踐中,對于服務(wù)間調(diào)用的容錯、擴(kuò)展性、并發(fā)性能等問題還需要做嚴(yán)謹(jǐn)?shù)目紤]或設(shè)計,而由于各種各樣的原因工程師們的設(shè)計往往有所欠缺。
????????對于多線程編程,經(jīng)常會出現(xiàn)的缺點(diǎn):線程維護(hù)困難、子線程出錯后難以恢復(fù)、線程阻塞時浪費(fèi)時間和資源;另外對于密集的計算任務(wù),我們的系統(tǒng)需要達(dá)到很高的并發(fā)性能,單機(jī)系統(tǒng)資源無法滿足計算需求,而類似java的fork/join框架又很難在分布式環(huán)境下簡易地對并發(fā)計算進(jìn)行架構(gòu)設(shè)計。
????????而akka框架非常適合解決上述問題。akka框架是一款高性能、高容錯性的分布式并發(fā)應(yīng)用框架。akka底層采用scala語言實(shí)現(xiàn),并基于actor并發(fā)模型,天然擁有異步、分布式能力,且具有很好的并發(fā)性能和容錯機(jī)制。
二、akka特點(diǎn)
akka典型的特點(diǎn):
- 并發(fā)模型:基于actor模型,對并發(fā)進(jìn)行高層次的抽象;
- 異步能力:基于actor模型進(jìn)行通信,天然具有異步非阻塞的特點(diǎn);
- 高容錯性:通過父子actor監(jiān)督機(jī)制進(jìn)行容錯處理,為akka分布式模型提供高容錯特性;
- 輕量級: 每個actor只占300bytes左右的內(nèi)存,1G內(nèi)存即可容納百萬級數(shù)量的actor;
- 位置透明:akka對actor地址進(jìn)行了抽象、屏蔽了本地地址和遠(yuǎn)程地址的差異,對開發(fā)者透明
- 持久化:actor狀態(tài)或消息可以被持久化,在jvm宕機(jī)后actor可以恢復(fù);
三、akka的actor模型
????????actor模型是對并發(fā)模型的高層次抽象,從底層屏蔽了線程、鎖機(jī)制的管理,為應(yīng)用開發(fā)提供了簡單易用的高層次api。

????????actor模型的幾個特征:
- 程序的計算都在actor中進(jìn)行。actor實(shí)例是程序的最小運(yùn)算單元;
- actor之間只能通過消息進(jìn)行通信。消息是異步傳遞的,每個actor都有一個郵箱,該郵箱接收其它actor發(fā)送的消息,actor實(shí)例從郵箱中取出消息進(jìn)行處理。actor實(shí)例內(nèi)部一次只能同步處理一個消息,因此可以安全的進(jìn)行狀態(tài)處理不用進(jìn)行程序加鎖。由于對消息的處理是異步的,所以發(fā)送完消息后可以立即返回進(jìn)行下一步處理(當(dāng)然也可以等待處理完成)。
- actor可以響應(yīng)其它actor發(fā)送的消息,并可以更改本身的狀態(tài)或行為、發(fā)送消息給其它actor、創(chuàng)建子actor、對其它actor進(jìn)行監(jiān)督
四、akka架構(gòu)體系
????????在akka中,整個actor體系被抽象成一個公共的actor系統(tǒng),即ActorSystem,ActorSystem是一個層級結(jié)構(gòu),通過"父監(jiān)督"模式和DeathWatch模式限定了actor的管理策略。
????????akka還提供了諸多的配套組件,例如網(wǎng)絡(luò)服務(wù)、持久化等。
ActorSystem
actor組件
????akka中actor組件具有幾個特征:
- actor引用(Actor Reference)
???? akka不能通過new的方式創(chuàng)建引用。代替new的方式是,通過actorOf(創(chuàng)建actor)或actorSelection(查找actor)等方式返回Actor對象引用。對開發(fā)者而言,actor位置透明(可能存在于本地或遠(yuǎn)程)。 - 狀態(tài)(State)
???? actor在不同時刻的狀態(tài)通常用變量來標(biāo)識。akka在底層為每個actor抽象一個輕量級的執(zhí)行“線程”,實(shí)現(xiàn)了對狀態(tài)的隔離。 - 行為(Behavior)
???? actor在接受到消息后可以對消息進(jìn)行處理,或者轉(zhuǎn)發(fā)給其它actor處理。 - 監(jiān)督策略 (Supervisor Strategy)
???? actorSystem是一個層級結(jié)構(gòu),父actor對子actor具有監(jiān)管的能力,可以針對子actor的異常進(jìn)行:恢復(fù)、重啟、停止、失敗上溯等處理方案,另外提供了One-For-One(默認(rèn),只對異常的子actor進(jìn)行處理)和All-For-One(對所有子actor進(jìn)行處理)兩種監(jiān)督策略。
郵箱
???? 每個actor都擁有自己的郵箱,所有接受的消息會先進(jìn)入郵箱,actor從郵箱中取出消息進(jìn)行處理。akka自帶多種郵箱類型,并提供RequiresMessageQueue接口供開發(fā)者自定義特定類型的郵箱。
路由
???? actor消息也可以通過路由進(jìn)行發(fā)送,路由可以是一個Router對象,也可以是一個自包含的actor:管理者所有的Routee(路由目標(biāo))。開發(fā)者可以根據(jù)需要選擇不同的路由類型,如:輪詢、隨機(jī)、廣播等。
網(wǎng)絡(luò)服務(wù)
????????提供遠(yuǎn)程actor和分布式集群的基礎(chǔ)能力,包含I/O、網(wǎng)絡(luò)通信、序列化配置、gossip通信協(xié)議、節(jié)點(diǎn)管理、集群分片等
http、websocket模塊
????????akka提供了處理 http、websocket協(xié)議的基礎(chǔ)模塊,可以在此基礎(chǔ)上進(jìn)行開發(fā)。
持久化
????????akka提供actor的狀態(tài)持久化方案,在程序出錯、宕機(jī)等場景下進(jìn)行恢復(fù)。
五、總結(jié)
????????akka具有異步、分布式、高容錯等特性,適合作為分布式應(yīng)用的基礎(chǔ)開發(fā)框架,比如,目前比較火的流計算引擎flink也采用akka作為分布式通信框架。開發(fā)者也可以用akka打造自己分布式應(yīng)用服務(wù)!