一、背景
????????大型服務系統(tǒng)由于業(yè)務或功能的復雜性,為了維護和升級的便利廷没,往往在架構(gòu)上按對系統(tǒng)進行拆分宪彩,按不同功能拆分成不同的子服務,并進行分布式的部署主届。但在我們的實踐中赵哲,對于服務間調(diào)用的容錯、擴展性君丁、并發(fā)性能等問題還需要做嚴謹?shù)目紤]或設計枫夺,而由于各種各樣的原因工程師們的設計往往有所欠缺。
????????對于多線程編程绘闷,經(jīng)常會出現(xiàn)的缺點:線程維護困難橡庞、子線程出錯后難以恢復较坛、線程阻塞時浪費時間和資源;另外對于密集的計算任務扒最,我們的系統(tǒng)需要達到很高的并發(fā)性能丑勤,單機系統(tǒng)資源無法滿足計算需求,而類似java的fork/join框架又很難在分布式環(huán)境下簡易地對并發(fā)計算進行架構(gòu)設計吧趣。
????????而akka框架非常適合解決上述問題法竞。akka框架是一款高性能、高容錯性的分布式并發(fā)應用框架强挫。akka底層采用scala語言實現(xiàn)岔霸,并基于actor并發(fā)模型,天然擁有異步俯渤、分布式能力呆细,且具有很好的并發(fā)性能和容錯機制。
二稠诲、akka特點
akka典型的特點:
- 并發(fā)模型:基于actor模型侦鹏,對并發(fā)進行高層次的抽象;
- 異步能力:基于actor模型進行通信臀叙,天然具有異步非阻塞的特點略水;
- 高容錯性:通過父子actor監(jiān)督機制進行容錯處理,為akka分布式模型提供高容錯特性劝萤;
- 輕量級: 每個actor只占300bytes左右的內(nèi)存渊涝,1G內(nèi)存即可容納百萬級數(shù)量的actor;
- 位置透明:akka對actor地址進行了抽象床嫌、屏蔽了本地地址和遠程地址的差異跨释,對開發(fā)者透明
- 持久化:actor狀態(tài)或消息可以被持久化,在jvm宕機后actor可以恢復厌处;
三鳖谈、akka的actor模型
????????actor模型是對并發(fā)模型的高層次抽象,從底層屏蔽了線程阔涉、鎖機制的管理缆娃,為應用開發(fā)提供了簡單易用的高層次api。
????????actor模型的幾個特征:
- 程序的計算都在actor中進行瑰排。actor實例是程序的最小運算單元贯要;
- actor之間只能通過消息進行通信。消息是異步傳遞的椭住,每個actor都有一個郵箱崇渗,該郵箱接收其它actor發(fā)送的消息,actor實例從郵箱中取出消息進行處理。actor實例內(nèi)部一次只能同步處理一個消息宅广,因此可以安全的進行狀態(tài)處理不用進行程序加鎖葫掉。由于對消息的處理是異步的,所以發(fā)送完消息后可以立即返回進行下一步處理(當然也可以等待處理完成)乘碑。
- actor可以響應其它actor發(fā)送的消息挖息,并可以更改本身的狀態(tài)或行為、發(fā)送消息給其它actor兽肤、創(chuàng)建子actor套腹、對其它actor進行監(jiān)督
四、akka架構(gòu)體系
????????在akka中资铡,整個actor體系被抽象成一個公共的actor系統(tǒng)电禀,即ActorSystem,ActorSystem是一個層級結(jié)構(gòu)笤休,通過"父監(jiān)督"模式和DeathWatch模式限定了actor的管理策略尖飞。
????????akka還提供了諸多的配套組件,例如網(wǎng)絡服務店雅、持久化等政基。
ActorSystem
actor組件
????akka中actor組件具有幾個特征:
- actor引用(Actor Reference)
???? akka不能通過new的方式創(chuàng)建引用。代替new的方式是闹啦,通過actorOf(創(chuàng)建actor)或actorSelection(查找actor)等方式返回Actor對象引用沮明。對開發(fā)者而言,actor位置透明(可能存在于本地或遠程)窍奋。 - 狀態(tài)(State)
???? actor在不同時刻的狀態(tài)通常用變量來標識荐健。akka在底層為每個actor抽象一個輕量級的執(zhí)行“線程”,實現(xiàn)了對狀態(tài)的隔離琳袄。 - 行為(Behavior)
???? actor在接受到消息后可以對消息進行處理江场,或者轉(zhuǎn)發(fā)給其它actor處理。 - 監(jiān)督策略 (Supervisor Strategy)
???? actorSystem是一個層級結(jié)構(gòu)窖逗,父actor對子actor具有監(jiān)管的能力址否,可以針對子actor的異常進行:恢復、重啟碎紊、停止在张、失敗上溯等處理方案,另外提供了One-For-One(默認矮慕,只對異常的子actor進行處理)和All-For-One(對所有子actor進行處理)兩種監(jiān)督策略。
郵箱
???? 每個actor都擁有自己的郵箱啄骇,所有接受的消息會先進入郵箱痴鳄,actor從郵箱中取出消息進行處理。akka自帶多種郵箱類型缸夹,并提供RequiresMessageQueue接口供開發(fā)者自定義特定類型的郵箱痪寻。
路由
???? actor消息也可以通過路由進行發(fā)送螺句,路由可以是一個Router對象,也可以是一個自包含的actor:管理者所有的Routee(路由目標)橡类。開發(fā)者可以根據(jù)需要選擇不同的路由類型蛇尚,如:輪詢、隨機顾画、廣播等取劫。
網(wǎng)絡服務
????????提供遠程actor和分布式集群的基礎能力,包含I/O研侣、網(wǎng)絡通信谱邪、序列化配置、gossip通信協(xié)議庶诡、節(jié)點管理惦银、集群分片等
http、websocket模塊
????????akka提供了處理 http末誓、websocket協(xié)議的基礎模塊扯俱,可以在此基礎上進行開發(fā)。
持久化
????????akka提供actor的狀態(tài)持久化方案喇澡,在程序出錯迅栅、宕機等場景下進行恢復。
五撩幽、總結(jié)
????????akka具有異步库继、分布式、高容錯等特性窜醉,適合作為分布式應用的基礎開發(fā)框架宪萄,比如,目前比較火的流計算引擎flink也采用akka作為分布式通信框架榨惰。開發(fā)者也可以用akka打造自己分布式應用服務拜英!