.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