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