高效能最終一致性框架Ray之基本概念原理
一、Actor介紹
Actor是一種併發模型,是共享記憶體併發模型的替代方案。
共享記憶體模型的缺點:
-
共享記憶體模型使用各種各樣的鎖來解決狀態競爭問題,效能低下且讓編碼變得複雜和容易出錯。
-
共享記憶體受限於單節點的伺服器資源限制。
Actor模型的優點:
-
執行緒之間以訊息進行通訊,訊息按順序單執行緒處理,不存在狀態競爭。
-
以訊息方式通訊,可以方便的組建叢集。
-
把State和Behavior繫結,能更好的控制狀態。
名詞解釋:
Mailbox:可以理解為先入先出佇列,負責接收和快取送達的訊息。
State:狀態資訊,比如使用者的賬戶餘額資訊。
Behavior:負責按順序處理Mailbox中的訊息,比如扣款訊息、到賬訊息,查詢餘額訊息等。
二、Orleans介紹
Orleans是.Net基金會維護的一個Actor跨平臺開源框架,獨創Virtual Actor概念,支援分散式叢集。
專案地址:http://dotnet.github.io/orleans/
有以下優點:
-
以物件方式訪問Actor,符合面向物件的使用習慣。
-
提出Virtual Actor概念,可以通過ID訪問細粒度的Actor,能承載數千萬的Actor物件。
-
支援Stateful,能替代快取層來對記憶體狀態進行更精確的控制,減少資料庫的壓力。
-
高效能,單個Actor能支援10萬+的QPS。
-
啟用透明,Actor對訪問者是永久存在的,但也提供完整的生命週期控制,拓展方便。
-
原生支援叢集,但Actor位置透明,訪問者不需要關注Actor執行在那個節點,叢集會根據節點情況進行負載排程。
-
提供了多種叢集支援,叢集部署非常方便,支援AdoNet,Zookeeper,K8s,SF等。
-
提供了完整的單元測試解決方案,方便進行單元測試。
-
提供了完善的監控工具,能夠詳細的監測各種指標。
-
基於.net core,支援各種平臺。
名詞解釋:
Silo:叢集中的一個節點,負責維護當前節點的Grains。
SiloGateway:每個節點都存在,負責維護叢集狀態和轉發請求。
Grain:相當於Actor,通過ID+Interface來識別。
Client:用來訪問叢集中的Grain的客戶端工具。
三、Ray介紹
Ray是基於Actor模型構建的基於事件朔源的分散式最終一致性高效能框架,把傳統的複雜的分散式事務拆分為由事件驅動的線性處理流程的一種方式,效能和吞吐更高,響應更快。
Ray提供了狀態維護、事件釋出/訂閱、冪等性控制、分散式事務等模組,並內建了分散式ID、分散式鎖、分散式權重鎖等服務。
Ray提供卓越的效能,單個Actor能達到20000/s的事件。
專案地址:https://github.com/RayTale/Ray
名詞解釋:
-
狀態(State):記憶體聚合資料。
-
事件(Event):狀態變化的資訊。
-
EventBus:提供事件傳送和事件消費訂閱。
-
冪等性:保證事件送達多次不會導致狀態異常,例如上圖的A的轉賬事件多次送達B,但是B只會增加一次餘額。
Ray的最終一致性轉賬原理
A使用者呼叫A賬戶Actor的轉賬方法進行轉賬,A賬戶Actor根據記憶體狀態進行餘額校驗,如果餘額不足,則直接返回失敗原因,如果校驗成功則產生一個轉賬Event(記錄目標賬戶Id、轉賬金額、剩餘餘額)並持久化,然後修改記憶體狀態和傳送到EventBus。EventBus一個訂閱者根據事件資訊修改讀庫中A賬戶的餘額和往賬單表中插入一條轉賬賬單,另外一個訂閱者根據事件資訊呼叫B賬戶Actor的到賬方法,B賬戶Actor會產生一個到賬Event(記錄到賬金額、FromId、剩餘餘額)並持久化,然後修改記憶體狀態和傳送到EventBus,EventBus的一個訂閱者根據事件資訊修改讀庫中B賬戶的餘額和往賬單表中插入一條到賬賬單。