- Orleans:構建高性能分布式Actor服務
- 吳哲昊編著
- 1107字
- 2022-06-17 16:15:43
第1章 Orleans與Actor編程模型
1.1 什么是Actor編程模型
Actor模型于1973年由Carl Hewitt在論文“A Universal Modular ACTOR Formalism for Artificial Intelligence”中首次提出,最初是面向具有大量處理器的高并發計算機的并行計算模型,其核心思想是將系統中獨立的計算過程抽象為Actor(意為執行單元、響應元或激活幀)。如果說計算機程序中面向對象(Object Oriented)的建模方式是將業務實體(Entity)的狀態及行為進行聚合,那么Actor模型則是程序運行時的執行邏輯和業務實體狀態的聚合模型。
在傳統編程模型中,開發人員一般是以服務調用者的角度通過程序對業務數據進行更改,從而完成相應的邏輯操作的;而當多個服務調用者需要在同一時刻對共享數據進行修改時,即會產生數據的并行訪問沖突。為了解決沖突,應用程序開發人員需要在應用程序邏輯中顯式增加額外邏輯(如使用volatile關鍵字標注共享變量、使用原子操作或在并發操作前后增加內存屏障等),以保證共享數據的并發讀寫一致性。這些附加邏輯一方面會給應用程序的執行過程帶來額外的性能損耗(CPU緩存同步、線程切換、資源鎖競爭等),另一方面也引入了應用邏輯與數據操作的耦合關系,降低了應用程序的可維護性??梢钥闯觯褂蒙鲜瞿P秃驮O計思路構建的應用程序,在高并發場景下很容易由系統內大量的并發沖突而導致運行效率降低。
為了解決此類問題,Actor模型將數據和與其相關的行為邏輯聚合為一個Actor實例(或狀態對象):當應用程序需要修改數據時,約定只能通過該數據所屬的Actor對象進行操作,并限定每個Actor對象在同一時刻僅響應一個外部調用請求(即Actor實例的內部執行邏輯工作在單線程環境中);當Actor對象同時接收到多個外部調用請求時,將通過一定的規則(通常是先入先出FIFO)對外部請求進行排序并依次執行(見圖1-1)。同時,應用程序通過數據對象的ID標識其所屬的Actor實例,以區分不同Actor實例內所聚合的狀態數據和行為邏輯,并通過該標識訪問特定的Actor實例,外部或Actor實例間的邏輯調用通過消息的形式發送至對應Actor實例,調用結果同樣以消息的形式返回至調用者。Actor實例可以看作是邏輯可尋址的獨立運算及存儲單元,使用Actor模型實現的應用程序是由多個Actor實例組成的存儲運算陣列,具備了天然的并發調用處理能力。
可以看出,Actor模型在對Actor實例狀態數據進行隔離的同時,以單線程語義約束Actor實例對狀態數據點操作,并通過Actor間可尋址消息將復雜應用服務場景下的資源競爭轉化為消息有序的投遞與消費,通過Actor實例級別的有序隊列減少了高并發場景下由資源競爭帶來的運算性能損耗。因此,Actor模型是一種非阻塞的消息驅動模型,且各Actor實例間的弱耦合性也為應用程序帶來了良好的伸縮性,因此非常適用于構建高并發場景下的分布式互聯網應用服務。

?圖1-1 Actor實例間的消息傳遞與功能調用
目前,在各種語言平臺下已有多種基于Actor模型實現的應用程序開源框架,見表1-1。
表1-1 常見的Actor模型框架

- Mastering AndEngine Game Development
- 名師講壇:Java微服務架構實戰(SpringBoot+SpringCloud+Docker+RabbitMQ)
- C語言程序設計同步訓練與上機指導(第三版)
- Python編程從0到1(視頻教學版)
- Android應用案例開發大全(第二版)
- Image Processing with ImageJ
- Machine Learning for Developers
- ASP.NET Web API Security Essentials
- 軟件測試分析與實踐
- 交互設計師成長手冊:從零開始學交互
- Web前端測試與集成:Jasmine/Selenium/Protractor/Jenkins的最佳實踐
- 計算機程序的構造和解釋(JavaScript版)
- Python網絡爬蟲從入門到實踐
- Unity與C++網絡游戲開發實戰:基于VR、AI與分布式架構
- Python編程基礎