Akka入门(二)Akka的Actor模型如何满足现代分布式系统需求
Actor模型允許開發(fā)者:
?
- 在不訴諸鎖定的情況下實(shí)施封裝。
- 使用協(xié)作實(shí)體的模型對(duì)信號(hào)做出反應(yīng),改變狀態(tài),并相互發(fā)送信號(hào)以推動(dòng)整個(gè)應(yīng)用程序向前發(fā)展。
- 不要擔(dān)心與我們的世界觀不匹配的執(zhí)行機(jī)制。
(一)?消息傳遞的使用避免了鎖定和阻塞
與方法調(diào)用不同的是,Actor相互發(fā)送消息。發(fā)送消息不會(huì)將執(zhí)行線程從發(fā)送方傳輸?shù)侥繕?biāo)。Actor可以發(fā)送消息并繼續(xù)而不會(huì)阻塞。因此,它可以在相同的時(shí)間內(nèi)完成更多內(nèi)容。
對(duì)于對(duì)象,當(dāng)方法返回時(shí),它釋放對(duì)其執(zhí)行線程的控制。在這方面,Actor的行為與對(duì)象非常相似,它們?cè)谕瓿商幚懋?dāng)前消息時(shí)對(duì)消息作出反應(yīng)并返回執(zhí)行。通過這種方式,Actor實(shí)際上的執(zhí)行與我們的設(shè)想是一致的。
Actor模型中第二個(gè)關(guān)鍵變化是恢復(fù)封裝。Actors對(duì)消息作出反應(yīng),就像對(duì)象“響應(yīng)”他們的調(diào)用的方法一樣。不同之處在于,不是多個(gè)線程“突出”到我們的actor中并且對(duì)內(nèi)部狀態(tài)和不變量造成嚴(yán)重破壞,演員獨(dú)立于消息的發(fā)送者執(zhí)行,并且他們一次一個(gè)地順序響應(yīng)傳入的消息。當(dāng)每個(gè)actor按順序處理發(fā)送給它的消息時(shí),不同的actor彼此同時(shí)工作,以便actor系統(tǒng)可以同時(shí)處理盡可能多的消息,就像硬件支持的那樣。
由于每個(gè)actor最多只能處理一條消息,因此可以保持actor的不變量而不進(jìn)行同步。這種情況不使用鎖
?
?
總的來說,Actors收到消息將會(huì)發(fā)生以下事情:
為了實(shí)現(xiàn)這些行為,演員有:
- 郵箱(消息隊(duì)列到達(dá)處)。
- 行為(行為者的狀態(tài),內(nèi)部變量等)。
- 消息(表示信號(hào)的數(shù)據(jù)片段,類似于方法調(diào)用及其參數(shù))。
- 執(zhí)行環(huán)境(需要具有消息響應(yīng)并調(diào)用其消息處理代碼的actor的機(jī)制)。
- 地址
- 消息進(jìn)入actor郵箱。actor的行為描述了actor如何響應(yīng)消息(比如發(fā)送更多消息和/或改變狀態(tài))。執(zhí)行環(huán)境編排一個(gè)線程池,以完全透明地驅(qū)動(dòng)所有這些操作。
這是一個(gè)非常簡(jiǎn)單的模型,它解決了以前列舉的問題:
- 通過將執(zhí)行與信令解耦來保留封裝(方法調(diào)用傳輸執(zhí)行,消息傳遞不會(huì))。
- 沒有鎖。修改actor的內(nèi)部狀態(tài)只能通過消息進(jìn)行,消息一次處理一次,在嘗試保持不變量時(shí)消除競(jìng)爭(zhēng)。
- 在任何地方都沒有使用鎖,并且不會(huì)阻止發(fā)件人。可以在十幾個(gè)線程上有效地安排數(shù)百萬演員,充分發(fā)揮現(xiàn)代CPU的潛力。任務(wù)授權(quán)是演員的自然操作模式。
- 參與者的狀態(tài)是本地的而不是共享的,更改和數(shù)據(jù)通過消息傳播,這些消息映射到現(xiàn)代內(nèi)存層次結(jié)構(gòu)實(shí)際上的工作方式。在許多情況下,這意味著只傳輸包含消息中數(shù)據(jù)的緩存行,同時(shí)保持本地狀態(tài)和數(shù)據(jù)緩存在原始核心。相同的模型完全映射到遠(yuǎn)程通信,其中狀態(tài)保存在機(jī)器的RAM中,并且更改/數(shù)據(jù)作為分組在網(wǎng)絡(luò)上傳播。
?(二)Actor優(yōu)雅地處理錯(cuò)誤情況
由于我們不再在彼此發(fā)送消息的Actor之間擁有共享調(diào)用堆棧,因此我們需要以不同方式處理錯(cuò)誤情況。我們需要考慮兩種錯(cuò)誤:
- 第一種情況是目標(biāo)Actor上的委托任務(wù)由于任務(wù)中的錯(cuò)誤而失敗(通常是一些驗(yàn)證問題,如不存在的用戶ID)。在這種情況下,目標(biāo)Actor封裝的服務(wù)是完整的,只有任務(wù)本身是錯(cuò)誤的。服務(wù)參與者應(yīng)該使用消息回復(fù)發(fā)件人,并提供錯(cuò)誤案例。這里沒有什么特別的,錯(cuò)誤是域的一部分,因此成為普通的消息。
- 第二種情況是服務(wù)本身遇到內(nèi)部故障。Akka強(qiáng)制所有Actor都被組織成一個(gè)樹狀的層次結(jié)構(gòu),即創(chuàng)建另一個(gè)Actor的Actor成為該新Actor的父級(jí)。這與操作系統(tǒng)將進(jìn)程組織到樹中的方式非常相似。就像進(jìn)程一樣,當(dāng)一個(gè)Actor失敗時(shí),它的父Actor會(huì)得到通知,它可以對(duì)失敗作出反應(yīng)。此外,如果父actor已停止,則其所有子項(xiàng)也將以遞歸方式停止。這項(xiàng)服務(wù)被稱為監(jiān)督,它是Akka的核心。
主管(父母)可以決定在某些類型的故障中重新啟動(dòng)其子actor,或者完全阻止其他人。孩子們永遠(yuǎn)不會(huì)沉默地死去(除了進(jìn)入無限循環(huán)之外),他們要么失敗而且他們的父母可以對(duì)錯(cuò)誤作出反應(yīng),要么他們被停止(在這種情況下,感興趣的一方會(huì)自動(dòng)得到通知)。總是有一個(gè)負(fù)責(zé)任的實(shí)體來管理一個(gè)Actor:它的父母。此外,重新啟動(dòng)對(duì)外部是看不到的:協(xié)作Actor可以在目標(biāo)Actor重新啟動(dòng)時(shí)繼續(xù)發(fā)送消息。
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的Akka入门(二)Akka的Actor模型如何满足现代分布式系统需求的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Akka入门(一)Akka简介与为什么使
- 下一篇: Akka之在IoT系统中使用Actor(