高性能最终一致性框架Ray之基本概念原理
一、Actor介紹
Actor是一種并發(fā)模型,是共享內(nèi)存并發(fā)模型的替代方案。
共享內(nèi)存模型的缺點(diǎn):
共享內(nèi)存模型使用各種各樣的鎖來(lái)解決狀態(tài)競(jìng)爭(zhēng)問(wèn)題,性能低下且讓編碼變得復(fù)雜和容易出錯(cuò)。
共享內(nèi)存受限于單節(jié)點(diǎn)的服務(wù)器資源限制。
Actor模型的優(yōu)點(diǎn):
線程之間以消息進(jìn)行通信,消息按順序單線程處理,不存在狀態(tài)競(jìng)爭(zhēng)。
以消息方式通信,可以方便的組建集群。
把State和Behavior綁定,能更好的控制狀態(tài)。
名詞解釋:
Mailbox:可以理解為先入先出隊(duì)列,負(fù)責(zé)接收和緩存送達(dá)的消息。
State:狀態(tài)信息,比如用戶的賬戶余額信息。
Behavior:負(fù)責(zé)按順序處理Mailbox中的消息,比如扣款消息、到賬消息,查詢余額消息等。
二、Orleans介紹
Orleans是.Net基金會(huì)維護(hù)的一個(gè)Actor跨平臺(tái)開(kāi)源框架,獨(dú)創(chuàng)Virtual Actor概念,支持分布式集群。
項(xiàng)目地址:http://dotnet.github.io/orleans/
有以下優(yōu)點(diǎn):
以對(duì)象方式訪問(wèn)Actor,符合面向?qū)ο蟮氖褂昧?xí)慣。
提出Virtual Actor概念,可以通過(guò)ID訪問(wèn)細(xì)粒度的Actor,能承載數(shù)千萬(wàn)的Actor對(duì)象。
支持Stateful,能替代緩存層來(lái)對(duì)內(nèi)存狀態(tài)進(jìn)行更精確的控制,減少數(shù)據(jù)庫(kù)的壓力。
高性能,單個(gè)Actor能支持10萬(wàn)+的QPS。
激活透明,Actor對(duì)訪問(wèn)者是永久存在的,但也提供完整的生命周期控制,拓展方便。
原生支持集群,但Actor位置透明,訪問(wèn)者不需要關(guān)注Actor運(yùn)行在那個(gè)節(jié)點(diǎn),集群會(huì)根據(jù)節(jié)點(diǎn)情況進(jìn)行負(fù)載調(diào)度。
提供了多種集群支持,集群部署非常方便,支持AdoNet,Zookeeper,K8s,SF等。
提供了完整的單元測(cè)試解決方案,方便進(jìn)行單元測(cè)試。
提供了完善的監(jiān)控工具,能夠詳細(xì)的監(jiān)測(cè)各種指標(biāo)。
基于.net core,支持各種平臺(tái)。
名詞解釋:
Silo:集群中的一個(gè)節(jié)點(diǎn),負(fù)責(zé)維護(hù)當(dāng)前節(jié)點(diǎn)的Grains。
SiloGateway:每個(gè)節(jié)點(diǎn)都存在,負(fù)責(zé)維護(hù)集群狀態(tài)和轉(zhuǎn)發(fā)請(qǐng)求。
Grain:相當(dāng)于Actor,通過(guò)ID+Interface來(lái)識(shí)別。
Client:用來(lái)訪問(wèn)集群中的Grain的客戶端工具。
三、Ray介紹
Ray是基于Actor模型構(gòu)建的基于事件朔源的分布式最終一致性高性能框架,把傳統(tǒng)的復(fù)雜的分布式事務(wù)拆分為由事件驅(qū)動(dòng)的線性處理流程的一種方式,性能和吞吐更高,響應(yīng)更快。
Ray提供了狀態(tài)維護(hù)、事件發(fā)布/訂閱、冪等性控制、分布式事務(wù)等模塊,并內(nèi)置了分布式ID、分布式鎖、分布式權(quán)重鎖等服務(wù)。
Ray提供卓越的性能,單個(gè)Actor能達(dá)到20000/s的事件。
項(xiàng)目地址:https://github.com/RayTale/Ray
名詞解釋:
狀態(tài)(State):內(nèi)存聚合數(shù)據(jù)。
事件(Event):狀態(tài)變化的信息。
EventBus:提供事件發(fā)送和事件消費(fèi)訂閱。
冪等性:保證事件送達(dá)多次不會(huì)導(dǎo)致?tīng)顟B(tài)異常,例如上圖的A的轉(zhuǎn)賬事件多次送達(dá)B,但是B只會(huì)增加一次余額。
Ray的最終一致性轉(zhuǎn)賬原理
A用戶調(diào)用A賬戶Actor的轉(zhuǎn)賬方法進(jìn)行轉(zhuǎn)賬,A賬戶Actor根據(jù)內(nèi)存狀態(tài)進(jìn)行余額校驗(yàn),如果余額不足,則直接返回失敗原因,如果校驗(yàn)成功則產(chǎn)生一個(gè)轉(zhuǎn)賬Event(記錄目標(biāo)賬戶Id、轉(zhuǎn)賬金額、剩余余額)并持久化,然后修改內(nèi)存狀態(tài)和發(fā)送到EventBus。EventBus一個(gè)訂閱者根據(jù)事件信息修改讀庫(kù)中A賬戶的余額和往賬單表中插入一條轉(zhuǎn)賬賬單,另外一個(gè)訂閱者根據(jù)事件信息調(diào)用B賬戶Actor的到賬方法,B賬戶Actor會(huì)產(chǎn)生一個(gè)到賬Event(記錄到賬金額、FromId、剩余余額)并持久化,然后修改內(nèi)存狀態(tài)和發(fā)送到EventBus,EventBus的一個(gè)訂閱者根據(jù)事件信息修改讀庫(kù)中B賬戶的余額和往賬單表中插入一條到賬賬單。
原文鏈接:https://www.cnblogs.com/gengzhe/p/ray_actor.html
.NET社區(qū)新聞,深度好文,歡迎訪問(wèn)公眾號(hào)文章匯總?http://www.csharpkit.com?
總結(jié)
以上是生活随笔為你收集整理的高性能最终一致性框架Ray之基本概念原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 基于Dapper的开源Lambda扩展,
- 下一篇: 表达式树练习实践:入门基础