.NET現(xiàn)代化應(yīng)用開發(fā) - CQRS&類目管理代碼剖析
上周MASA Framework 進(jìn)行了第四次課程直播,課程主題為類目管理的開發(fā),直播中進(jìn)行了理論講解和實(shí)戰(zhàn)演練(CQRS實(shí)踐的演示可直達(dá)推文底部觀看直播回放)
開始環(huán)節(jié)我們圍繞三個(gè)點(diǎn)介紹CQRS的原理
首先,我們先對(duì)之前的事件流概念進(jìn)行簡單的回顧
事件風(fēng)暴回顧 - 事件流

接下來到我們本節(jié)課的主題內(nèi)容
CQRS
命令查詢職責(zé)分離
大白話:讀和寫分開
信息來源:https://docs.microsoft.com/zh-cn/azure/architecture/patterns/cqrs

優(yōu)勢
獨(dú)立縮放
根據(jù)讀寫分別優(yōu)化數(shù)據(jù)結(jié)構(gòu)
更輕松地確保僅正確的域?qū)嶓w對(duì)數(shù)據(jù)執(zhí)行寫入
關(guān)注點(diǎn)分離,讀關(guān)注讀取性能,寫關(guān)注復(fù)雜業(yè)務(wù)邏輯
物化視圖的讀模型可有效減少復(fù)雜的表鏈接
什么時(shí)候用
源于訪問頻次、數(shù)據(jù)量或者是數(shù)據(jù)模型數(shù)量等因素導(dǎo)致查詢和更新的需求差距逐漸變大
最大限度地提高性能
控制細(xì)粒度的縮放
控制不同應(yīng)用的安全級(jí)別
降低多開發(fā)者協(xié)作沖突,事件的粒度可以足夠細(xì)
注意
命令應(yīng)基于任務(wù),而不是數(shù)據(jù)
命令可入隊(duì),使用異步而非同步
查詢不包含修改動(dòng)作和領(lǐng)域知識(shí)?
事件溯源支持重播,比如用于通知讀模型
事件溯源
只追加存儲(chǔ)來記錄對(duì)數(shù)據(jù)采取的完整系列操作
而不是僅存儲(chǔ)域中數(shù)據(jù)的當(dāng)前狀態(tài)
優(yōu)勢
事件不可變
事件有助于領(lǐng)域?qū)<伊私膺^程
事件只增不改,不需要考慮并發(fā)沖突
事件存儲(chǔ)有助于監(jiān)控?cái)?shù)據(jù)變化
事件重播可輕易的對(duì)系統(tǒng)狀態(tài)進(jìn)行還原,調(diào)試,測試
事件可被不同的應(yīng)用多次,異步消費(fèi)
注意
事件驅(qū)動(dòng)是異步的,讀模型會(huì)有一定程度的延遲
修改事件的唯一方式只能通過補(bǔ)償事件
事件順序至關(guān)重要,事件存儲(chǔ)有責(zé)任保證事件順序完整性
不管是上面講到的CQRS,還是事件溯源,這些都是為事件驅(qū)動(dòng)做準(zhǔn)備
??
事件驅(qū)動(dòng)的小知識(shí)點(diǎn)
事件驅(qū)動(dòng)里有一些值得注意的點(diǎn)

事件不等于命令
1事件不會(huì)告訴訂閱者如何做
2.事件只通知某個(gè)事件發(fā)生了
3.事件是不可變的
4.事件被執(zhí)行時(shí),可能會(huì)產(chǎn)生新的事件并形成事件流
事件標(biāo)準(zhǔn)化
支持過濾/轉(zhuǎn)換/查詢等
事件其實(shí)是需要標(biāo)準(zhǔn)化的,那有沒有標(biāo)準(zhǔn)呢?
那就是CloudEvents
CloudEvents
包含了事件發(fā)生的上下文和相關(guān)數(shù)據(jù),事件代表了已發(fā)生的事實(shí),不包含任何目的地相關(guān)信息。消息能夠傳達(dá)事件內(nèi)容,從而將事件數(shù)據(jù)從源頭傳輸?shù)街付ǖ哪康牡?/p>
1.發(fā)送的消息符合規(guī)范,那么它就是一個(gè)有效的 CloudEvent
2.支持的云廠商包括微軟,谷歌,阿里,甲骨文等
那我們來看事件和訂閱者的關(guān)系,事件和訂閱者可以是一對(duì)多、一對(duì)一、多對(duì)一,但事實(shí)上事件和訂閱者的關(guān)系是多對(duì)多
事件驅(qū)動(dòng)的使用場景

微服務(wù)解耦,跨集群通信
兼顧遺留,系統(tǒng)對(duì)接
游走在云與非云中
部分 AOP類場景
流計(jì)算
Event Bus

簡單來說,Event Bus主要的功能是接收消息、處理消息、轉(zhuǎn)發(fā)消息,作為發(fā)布者和訂閱者中轉(zhuǎn)站的角色
發(fā)布訂閱模式
發(fā)布者通過調(diào)度中心將消息發(fā)送給訂閱者。調(diào)度中心解決發(fā)布與訂閱者之間的關(guān)系,保證消息可以送達(dá)訂閱者手中
最常見的是并行執(zhí)行和順序執(zhí)行

MASA 事件處理
MASA 是如何進(jìn)行事件處理的?
MASA 事件處理主要分為兩部分一個(gè)是MASA Dispatcher,另一個(gè)是MASA DDD

MASA Dispatcher>>
Event Bus>>進(jìn)程內(nèi)事件總線
Integration Event Bus>>集成事件總線(跨進(jìn)程)
MASA DDD>>Domain Event Bus>>領(lǐng)域事件總線?(自動(dòng)協(xié)調(diào)進(jìn)程內(nèi)事件和集成事件調(diào)度)
通過前面的學(xué)習(xí),我們已經(jīng)了解了Event Bus 和MASA 事件處理流程,那MASA?Event Bus 是怎么樣的一個(gè)事件流程?
MASA Event Bus

發(fā)布者把事件發(fā)布到Even Bus
▼
關(guān)系鏈表支持特性Handler中間件分布式事務(wù)UoW更多...
▼
發(fā)送到訂閱者

本次課程內(nèi)容到這里就全部結(jié)束,CQRS實(shí)戰(zhàn)演示部分可以點(diǎn)擊下方鏈接,觀看直播回放。
.NET現(xiàn)代化應(yīng)用開發(fā) - CQRS&類目管理代碼剖析

如果你對(duì)我們MASA感興趣,無論是代碼貢獻(xiàn)、使用、提 Issue,歡迎聯(lián)系我們
WeChat:MasaStackTechOps
QQ:7424099