Akka
什么是Akka
Akka是一組用于構(gòu)建高并發(fā)(highly concurrent),分布式(distributed)万俗,彈性(resilient)湾笛,消息驅(qū)動(dòng)(message-driven)的JAVA和SCALA應(yīng)用的工具包。
為什么用Akka
- 更簡單的高并發(fā)實(shí)現(xiàn)
- 彈性設(shè)計(jì)闰歪,自愈&容錯(cuò)
- 高性能(單機(jī)處理5千萬消息/秒)嚎研,輕量級(jí)事件(1GB內(nèi)存可創(chuàng)建250萬actor)
- 集群部署,分布式節(jié)點(diǎn)
- 響應(yīng)式編程课竣,異步非阻塞事件驅(qū)動(dòng)
Akka工作視圖
上圖是一個(gè)類似樹狀層次結(jié)構(gòu)嘉赎,ActorSystem的Top-Level層次結(jié)構(gòu),與Actor關(guān)聯(lián)起來于樟,稱為Actor路徑(Actor Path)公条,不同的路徑代表了不同的監(jiān)督范圍(Supervision Scope)。下面說明ActorSystem的監(jiān)督范圍:
- “/”路徑:通過根路徑可以搜索到所有的Actor
- “/user”路徑:用戶創(chuàng)建的Top-Level Actor在該路徑下面迂曲,通過調(diào)用ActorSystem.actorOf來實(shí)現(xiàn)Actor的創(chuàng)建
- “/system”路徑:系統(tǒng)創(chuàng)建的Top-Level Actor在該路徑下面
Actor
普通的并發(fā)編程方式
多線程方法調(diào)用
多線程調(diào)用棧
問題:
需要上鎖靶橱,防止并發(fā)導(dǎo)致的數(shù)據(jù)錯(cuò)亂;
鎖成本高,應(yīng)用被阻塞关霸,多cpu利用率低传黄,死鎖;
多線程管理和異常處理較麻煩队寇;
事件驅(qū)動(dòng)編程
Actor模型是一個(gè)并行計(jì)算(Concurrent Computation)模型,它把a(bǔ)ctor作為并行計(jì)算的基本元素來對待:為響應(yīng)一個(gè)接收到的消息佳遣,一個(gè)actor能夠自己做出一些決策,如創(chuàng)建更多的actor窒舟,或發(fā)送更多的消息,或者確定如何去響應(yīng)接收到的下一個(gè)消息
Actor通過消息協(xié)作诵盼,而不是call method
Actor作為Akka最小的并發(fā)單元,充當(dāng)了消息的執(zhí)行者和信使洁墙,它包含什么:
- 收件箱(存儲(chǔ)消息隊(duì)列)
- 行為(狀態(tài),僅內(nèi)部可變)
- 消息列表(待處理的任務(wù))
- 地址
Actor生命周期
ActorSystem
在Akka中杀糯,一個(gè)ActorSystem是一個(gè)重量級(jí)的結(jié)構(gòu)扫俺,他需要分配多個(gè)線程固翰,所以在實(shí)際應(yīng)用中,按照邏輯劃分的每個(gè)應(yīng)用對應(yīng)一個(gè)ActorSystem實(shí)例
一個(gè)ActorSystem是具有分層結(jié)構(gòu)(Hierarchical Structure)的:一個(gè)Actor能夠管理(Oversee)某個(gè)特定的函數(shù)疗琉,他可能希望將一個(gè)task分解為更小的多個(gè)子task歉铝,這樣它就需要?jiǎng)?chuàng)建多個(gè)子Actor(Child Actors),并監(jiān)督這些子Actor處理任務(wù)的進(jìn)度等詳細(xì)情況柠贤,實(shí)際上這個(gè)Actor創(chuàng)建了一個(gè)Supervisor來監(jiān)督管理子Actor執(zhí)行拆分后的多個(gè)子task类缤,如果一個(gè)子Actor執(zhí)行子task失敗,那么就要向Supervisor發(fā)送一個(gè)消息說明處理子task失敗宴霸。需要知道的是,一個(gè)Actor能且僅能有一個(gè)Supervisor瓢谢,就是創(chuàng)建它的那個(gè)Actor氓扛。基于被監(jiān)控任務(wù)的性質(zhì)和失敗的性質(zhì)采郎,一個(gè)Supervisor可以選擇執(zhí)行如下操作選擇:
- 重新開始(Resume)一個(gè)子Actor尉剩,保持它內(nèi)部的狀態(tài)
- 重啟一個(gè)子Actor,清除它內(nèi)部的狀態(tài)
- 終止一個(gè)子Actor
- 擴(kuò)大失敗的影響毅臊,從而使這個(gè)子Actor失敗