高性能最終一致性框架Ray之基本概念原理
- 2019 年 10 月 3 日
- 筆記
一、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賬戶的餘額和往賬單表中插入一條到賬賬單。