.NET分布式大規模計算利器-Orleans(一)


 

寫在前面

Orleans是基於Actor模型思想的.NET領域的框架,它提供了一種直接而簡單的方法來構建分布式大規模計算應用程序,而無需學習和應用復雜的並發或其他擴展模式。我在2015年下半年開始應用Orleans,當時公司的交易系統采用的架構就是基於Orleans框架的,其展現出來的高性能、高並發以及驚人的穩定性深深地吸引了我,也讓我認識到了傳統三層無狀態架構的缺陷。本文主要關注Orleans的思想基礎,Actor模型及其應用。

Orleans思想基礎:Actor模型

傳統三層無狀態架構的缺陷

在討論Actor模型之前,我們可以先討論一下傳統三層架構在當前高並發環境中所面臨的尷尬境遇。

三層架構包括表示層、業務邏輯層或者叫做中間層、數據訪問層(也就是存儲層),其架構圖如下所示:

533598-20190309215340920-1387545480

正如我們在實踐中所知道的那樣,中間層和數據訪問層在伸縮性方面有着很大的限制,同時存儲層常常會成為系統的瓶頸,這就意味着整套系統也會因為存儲層的限制而變得低效。通常的做法是在中間層與存儲層中間加一層緩存邏輯出來,以提升系統性能,但是很快就會遇到存儲層與緩存層的數據一致性問題,這無疑為開發人員和運維人員增加了額外的工作量。

試想一下,如果我們中間層本身就攜帶着狀態或者簡單來說中間層與緩存層是合二為一的,那么我們的系統性能是不是就提升了一個級別,答案是肯定的。那么該如何去做呢?那就是我們需要考慮使用另外一套系統設計架構:Actor模型。

Actor模型

Actor模型允許建立一個有狀態的中間層,其內存級的讀寫性能和特定於相關領域的業務實體行為,確保了系統的高性能以及數據的一致性。Actor模型天然的擁有着面向對象的程序設計功能。在實踐中我們應該把主要精力放到組件之間的消息傳遞,而不是對象的屬性和內部行為。

Actor模型作為一種用於處理並發計算的數學模型,它將Actor對象用作並發計算的通用基元,它也是一種重要的軟件設計思想,它在架構、設計、實現以及組件之間的消息傳遞方面有着非常好的應用,也更好的發揮了多核計算機的潛力。通過創建新的Actor對象,可以在計算操作的生命周期中以抽象方式提高系統的分布性。

Actor作為一種計算實體,它會對收到的消息做出回應,並且還會在內部做其他一些事情:

  • 向其他Actor對象發送消息
  • 創建一定數量的新Actor對象
  • 設置對下一條消息做出的回應方式

下圖展示了多種Actor模型的交互示例

actor1

Actor模型具有以下特點:

  • 通過異步消息方式進行通信:使消息就像從一個Actor對象傳輸到了另一個Actor對象(通過MailBox交互,這跟CSP的通信模式完全不同,有興趣的朋友可以自行查閱)
  • 狀態機:Actor模型支持有限狀態機
  • 獨立性:多個Actor對象之間不會共享狀態
  • 無鎖的並發處理方式:由於Actor不會共享狀態,且在同一時刻只處理一條消息,因而無需使用鎖策略,這極大的提高了Actor系統的性能
  • 並行性:當頂級Actor將任務分拆后發送給多個下級Actor后,可以使用Actor模型的並行處理方式
  • 位置透明:可以使用抽象引用表示Actor對象的地址
  • Future/Promise對象:這是對異步操作的發送與接收方式,以表示異步操作的完成結果

Orleans對Actor的應用

Actor平台(例如Erlang和Akka)在簡化分布式系統編程方面向前邁了一步。但是,由於提供的抽象和系統服務的水平相對較低,它們仍然使開發人員承擔着許多分布式系統的復雜性。主要包括開發用於管理Actor的生命周期,處理分布式簇,處理Actor的失敗和恢復,放置Actor以及由此產生的管理分布式資源的應用程序代碼。要為應用程序中的這些問題構建正確的解決方案,這就開發人員的要求就非常高了,必須是分布式系統專家級別的。

為了減少這些問題的發生,Orleans框架引入了虛擬Actor的新型抽象,它解決了許多復雜的分布式系統問題,例如可靠性和分布式資源管理,從而使開發人員擺脫了那些麻煩。同時,Orleans運行時使應用程序能夠獲得高性能,可靠性和可伸縮性。

Orleans對Actor的實現特點:

  • Orleans Actor無處不在:無法明確創建或銷毀它。它的生命周期超越了其任何內存對象的生命周期,因此也超越了任何特定服務器的生命周期。
  • Orleans Actor會自動實例化:如果沒有Actor的內存實例,則發送給Actor的消息會促使在可用服務器上創建一個新實例。作為運行時資源管理的一部分,將自動回收未使用的Actor實例。Actor永遠不會失敗:如果服務器崩潰了,下一條發送給運行在故障服務器上的Actor的消息將會促使Orleans自動在另一台服務器上重新實例化該Actor ,從而無需應用程序來監督和顯式重新創建已經掛掉的Actor。
  • Actor實例的位置對於應用程序代碼是透明的,從而大大簡化了編程。
  • Orleans可以自動創建同一個無狀態Actor的多個實例,從而無縫擴展熱門Actor。

虛擬Actor的引入,相當於為開發者提供了一個虛擬的內存空間,使開發人員可以調用系統中的任何角色,無論它是否存在於內存中。虛擬化依賴於從虛擬角色映射到當前運行的物理實例的間接尋址。運行時通過一個分布式目錄支持間接尋址,該目錄將Actor標識映射到其當前物理位置。Orleans通過使用該映射的本地緩存來最小化間接尋址的運行時開銷。這個策略被證明是非常有效的。在微軟的生產服務中,緩存命中率通常遠遠超過90%。

下圖展示了微軟對Orleans的應用

orleans-orleans

 

參考鏈接:https://www.microsoft.com/en-us/research/project/orleans-virtual-actors/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM