?
寫(xiě)在前面
Orleans是基于Actor模型思想的.NET領(lǐng)域的框架,它提供了一種直接而簡(jiǎn)單的方法來(lái)構(gòu)建分布式大規(guī)模計(jì)算應(yīng)用程序,而無(wú)需學(xué)習(xí)和應(yīng)用復(fù)雜的并發(fā)或其他擴(kuò)展模式。我在2015年下半年開(kāi)始應(yīng)用Orleans,當(dāng)時(shí)公司的交易系統(tǒng)采用的架構(gòu)就是基于Orleans框架的,其展現(xiàn)出來(lái)的高性能、高并發(fā)以及驚人的穩(wěn)定性深深地吸引了我,也讓我認(rèn)識(shí)到了傳統(tǒng)三層無(wú)狀態(tài)架構(gòu)的缺陷。本文主要關(guān)注Orleans的思想基礎(chǔ),Actor模型及其應(yīng)用。
Orleans思想基礎(chǔ):Actor模型
傳統(tǒng)三層無(wú)狀態(tài)架構(gòu)的缺陷
在討論Actor模型之前,我們可以先討論一下傳統(tǒng)三層架構(gòu)在當(dāng)前高并發(fā)環(huán)境中所面臨的尷尬境遇。
三層架構(gòu)包括表示層、業(yè)務(wù)邏輯層或者叫做中間層、數(shù)據(jù)訪(fǎng)問(wèn)層(也就是存儲(chǔ)層),其架構(gòu)圖如下所示:
<https://img2018.cnblogs.com/blog/533598/201909/533598-20190922155517012-335631976.png>
正如我們?cè)趯?shí)踐中所知道的那樣,中間層和數(shù)據(jù)訪(fǎng)問(wèn)層在伸縮性方面有著很大的限制,同時(shí)存儲(chǔ)層常常會(huì)成為系統(tǒng)的瓶頸,這就意味著整套系統(tǒng)也會(huì)因?yàn)榇鎯?chǔ)層的限制而變得低效。通常的做法是在中間層與存儲(chǔ)層中間加一層緩存邏輯出來(lái),以提升系統(tǒng)性能,但是很快就會(huì)遇到存儲(chǔ)層與緩存層的數(shù)據(jù)一致性問(wèn)題,這無(wú)疑為開(kāi)發(fā)人員和運(yùn)維人員增加了額外的工作量。
試想一下,如果我們中間層本身就攜帶著狀態(tài)或者簡(jiǎn)單來(lái)說(shuō)中間層與緩存層是合二為一的,那么我們的系統(tǒng)性能是不是就提升了一個(gè)級(jí)別,答案是肯定的。那么該如何去做呢?那就是我們需要考慮使用另外一套系統(tǒng)設(shè)計(jì)架構(gòu):Actor模型。
Actor模型
Actor模型允許建立一個(gè)有狀態(tài)的中間層,其內(nèi)存級(jí)的讀寫(xiě)性能和特定于相關(guān)領(lǐng)域的業(yè)務(wù)實(shí)體行為,確保了系統(tǒng)的高性能以及數(shù)據(jù)的一致性。Actor模型天然的擁有著面向?qū)ο蟮某绦蛟O(shè)計(jì)功能。在實(shí)踐中我們應(yīng)該把主要精力放到組件之間的消息傳遞,而不是對(duì)象的屬性和內(nèi)部行為。
Actor模型作為一種用于處理并發(fā)計(jì)算的數(shù)學(xué)模型,它將Actor對(duì)象用作并發(fā)計(jì)算的通用基元,它也是一種重要的軟件設(shè)計(jì)思想,它在架構(gòu)、設(shè)計(jì)、實(shí)現(xiàn)以及組件之間的消息傳遞方面有著非常好的應(yīng)用,也更好的發(fā)揮了多核計(jì)算機(jī)的潛力。通過(guò)創(chuàng)建新的Actor對(duì)象,可以在計(jì)算操作的生命周期中以抽象方式提高系統(tǒng)的分布性。
Actor作為一種計(jì)算實(shí)體,它會(huì)對(duì)收到的消息做出回應(yīng),并且還會(huì)在內(nèi)部做其他一些事情:
* 向其他Actor對(duì)象發(fā)送消息
* 創(chuàng)建一定數(shù)量的新Actor對(duì)象
* 設(shè)置對(duì)下一條消息做出的回應(yīng)方式
下圖展示了多種Actor模型的交互示例
<https://img2018.cnblogs.com/blog/533598/201909/533598-20190922155517635-1795176271.png>
Actor模型具有以下特點(diǎn):
*
通過(guò)異步消息方式進(jìn)行通信:使消息就像從一個(gè)Actor對(duì)象傳輸?shù)搅肆硪粋€(gè)Actor對(duì)象(通過(guò)MailBox交互,這跟CSP的通信模式完全不同,有興趣的朋友可以自行查閱)
* 狀態(tài)機(jī):Actor模型支持有限狀態(tài)機(jī)
* 獨(dú)立性:多個(gè)Actor對(duì)象之間不會(huì)共享狀態(tài)
* 無(wú)鎖的并發(fā)處理方式:由于Actor不會(huì)共享狀態(tài),且在同一時(shí)刻只處理一條消息,因而無(wú)需使用鎖策略,這極大的提高了Actor系統(tǒng)的性能
* 并行性:當(dāng)頂級(jí)Actor將任務(wù)分拆后發(fā)送給多個(gè)下級(jí)Actor后,可以使用Actor模型的并行處理方式
* 位置透明:可以使用抽象引用表示Actor對(duì)象的地址
* Future/Promise對(duì)象:這是對(duì)異步操作的發(fā)送與接收方式,以表示異步操作的完成結(jié)果
Orleans對(duì)Actor的應(yīng)用
Actor平臺(tái)(例如Erlang和Akka)在簡(jiǎn)化分布式系統(tǒng)編程方面向前邁了一步。但是,由于提供的抽象和系統(tǒng)服務(wù)的水平相對(duì)較低,它們?nèi)匀皇归_(kāi)發(fā)人員承擔(dān)著許多分布式系統(tǒng)的復(fù)雜性。主要包括開(kāi)發(fā)用于管理Actor的生命周期,處理分布式簇,處理Actor的失敗和恢復(fù),放置Actor以及由此產(chǎn)生的管理分布式資源的應(yīng)用程序代碼。要為應(yīng)用程序中的這些問(wèn)題構(gòu)建正確的解決方案,這就開(kāi)發(fā)人員的要求就非常高了,必須是分布式系統(tǒng)專(zhuān)家級(jí)別的。
為了減少這些問(wèn)題的發(fā)生,Orleans框架引入了虛擬Actor的新型抽象,它解決了許多復(fù)雜的分布式系統(tǒng)問(wèn)題,例如可靠性和分布式資源管理,從而使開(kāi)發(fā)人員擺脫了那些麻煩。同時(shí),Orleans運(yùn)行時(shí)使應(yīng)用程序能夠獲得高性能,可靠性和可伸縮性。
Orleans對(duì)Actor的實(shí)現(xiàn)特點(diǎn):
* Orleans Actor無(wú)處不在:無(wú)法明確創(chuàng)建或銷(xiāo)毀它。它的生命周期超越了其任何內(nèi)存對(duì)象的生命周期,因此也超越了任何特定服務(wù)器的生命周期。
* Orleans
Actor會(huì)自動(dòng)實(shí)例化:如果沒(méi)有Actor的內(nèi)存實(shí)例,則發(fā)送給Actor的消息會(huì)促使在可用服務(wù)器上創(chuàng)建一個(gè)新實(shí)例。作為運(yùn)行時(shí)資源管理的一部分,將自動(dòng)回收未使用的Actor實(shí)例。Actor永遠(yuǎn)不會(huì)失敗:如果服務(wù)器崩潰了,下一條發(fā)送給運(yùn)行在故障服務(wù)器上的Actor的消息將會(huì)促使Orleans自動(dòng)在另一臺(tái)服務(wù)器上重新實(shí)例化該Actor
,從而無(wú)需應(yīng)用程序來(lái)監(jiān)督和顯式重新創(chuàng)建已經(jīng)掛掉的Actor。
* Actor實(shí)例的位置對(duì)于應(yīng)用程序代碼是透明的,從而大大簡(jiǎn)化了編程。
* Orleans可以自動(dòng)創(chuàng)建同一個(gè)無(wú)狀態(tài)Actor的多個(gè)實(shí)例,從而無(wú)縫擴(kuò)展熱門(mén)Actor。
虛擬Actor的引入,相當(dāng)于為開(kāi)發(fā)者提供了一個(gè)虛擬的內(nèi)存空間,使開(kāi)發(fā)人員可以調(diào)用系統(tǒng)中的任何角色,無(wú)論它是否存在于內(nèi)存中。虛擬化依賴(lài)于從虛擬角色映射到當(dāng)前運(yùn)行的物理實(shí)例的間接尋址。運(yùn)行時(shí)通過(guò)一個(gè)分布式目錄支持間接尋址,該目錄將Actor標(biāo)識(shí)映射到其當(dāng)前物理位置。Orleans通過(guò)使用該映射的本地緩存來(lái)最小化間接尋址的運(yùn)行時(shí)開(kāi)銷(xiāo)。這個(gè)策略被證明是非常有效的。在微軟的生產(chǎn)服務(wù)中,緩存命中率通常遠(yuǎn)遠(yuǎn)超過(guò)90%。
下圖展示了微軟對(duì)Orleans的應(yīng)用
<https://img2018.cnblogs.com/blog/533598/201909/533598-20190922155518083-577463983.jpg>
?
參考鏈接:https://www.microsoft.com/en-us/research/project/orleans-virtual-actors/
<https://www.microsoft.com/en-us/research/project/orleans-virtual-actors/>
熱門(mén)工具 換一換
