.NET現代化應用開發 - CQRS&類目管理代碼剖析

語言: CN / TW / HK

九月MASA Framework 進行了第四次課程直播,課程主題為類目管理的開發,直播中進行了理論講解和實戰演練(CQRS實踐的演示可直達推文底部觀看直播回放)

開始環節我們圍繞三個點介紹CQRS的原理

首先,我們先對之前的事件流概念進行簡單的回顧

事件風暴回顧 - 事件流

接下來到我們本節課的主題內容

CQRS

命令查詢職責分離

大白話:讀和寫分開

信息來源:https://docs.microsoft.com/zh-cn/azure/architecture/patterns/cqrs

優勢

1.獨立縮放

2.根據讀寫分別優化數據結構

3.更輕鬆地確保僅正確的域實體對數據執行寫入

4.關注點分離,讀關注讀取性能,寫關注複雜業務邏輯

5.物化視圖的讀模型可有效減少複雜的錶鏈接

什麼時候用

1.源於訪問頻次、數據量或者是數據模型數量等因素導致查詢和更新的需求差距逐漸變大

2.最大限度地提高性能

3.控制細粒度的縮放

4.控制不同應用的安全級別

5.降低多開發者協作衝突,事件的粒度可以足夠細

注意

1.命令應基於任務,而不是數據

2.命令可入隊,使用異步而非同步

3.查詢不包含修改動作和領域知識

4.事件溯源支持重播,比如用於通知讀模型

事件溯源

只追加存儲來記錄對數據採取的完整系列操作

而不是僅存儲域中數據的當前狀態

優勢

1.事件不可變2.事件有助於領域專家瞭解過程3.事件只增不改,不需要考慮併發衝突4.事件存儲有助於監控數據變化5.事件重播可輕易的對系統狀態進行還原,調試,測試6.事件可被不同的應用多次,異步消費

注意

1.事件驅動是異步的,讀模型會有一定程度的延遲2.修改事件的唯一方式只能通過補償事件3.事件順序至關重要,事件存儲有責任保證事件順序完整性

不管是上面講到的CQRS,還是事件溯源,這些都是為事件驅動做準備

事件驅動

事件驅動的小知識點

事件驅動裏有一些值得注意的點

事件不等於 命令

1事件不會告訴訂閲者如何做2.事件只通知某個事件發生了3.事件是不可變的

4.事件被執行時,可能會產生新的事件並形成事件流

事件標準化

支持過濾/轉換/查詢等

事件其實是需要標準化的,那有沒有標準呢?

那就是CloudEvents

CloudEvents

包含了事件發生的上下文和相關數據,事件代表了已發生的事實,不包含任何目的地相關信息。消息能夠傳達事件內容,從而將事件數據從源頭傳輸到指定的目的地

1.發送的消息符合規範,那麼它就是一個有效的 CloudEvent

2.支持的雲廠商包括微軟,谷歌,阿里,甲骨文等

那我們來看事件和訂閲者的關係,事件和訂閲者可以是一對多、一對一、多對一,但事實上事件和訂閲者的關係是多對多

事件驅動的使用場景

微服務解耦,跨集羣通信

兼顧遺留,系統對接

遊走在雲與非雲中

部分 AOP類場景

流計算

Event Bus

簡單來説,Event Bus主要的功能是接收消息、處理消息、轉發消息,作為發佈者和訂閲者中轉站的角色

發佈訂閲模式

發佈者通過調度中心將消息發送給訂閲者。調度中心解決發佈與訂閲者之間的關係,保證消息可以送達訂閲者手中

最常見的是並行執行順序執行

MASA 事件處理

MASA 是如何進行事件處理的?

MASA 事件處理主要分為兩部分一個是MASA Dispatcher,另一個是MASA DDD

MASA Dispatcher>>

Event Bus>>進程內事件總線

Integration Event Bus>>集成事件總線(跨進程)

MASA DDD>>Domain Event Bus>>領域事件總線**(自動協調進程內事件和集成事件調度)**

通過前面的學習,我們已經瞭解了Event Bus 和MASA 事件處理流程,那MASA Event Bus 是怎麼樣的一個事件流程?

MASA Event Bus

發佈者把事件發佈到Even Bus

關係鏈表支持特性Handler中間件分佈式事務UoW更多...

發送到訂閲者

本次課程內容到這裏就全部結束,CQRS實戰演示部分可以點擊下方鏈接,觀看直播回放。

.NET現代化應用開發 - CQRS&類目管理代碼剖析


如果你對我們MASA感興趣,無論是代碼貢獻、使用、提 Issue,歡迎聯繫我們

  • WeChat:MasaStackTechOps

  • QQ:7424099