CQRS命令查詢職責分離

CQRS(Command Query Responsibility Segregation)命令查詢職責分離 命令:對系統產生【影響】,但無結果 查詢:對系統【不】產生【影響】,但有結果


查詢
boolean isExist= File.exist(File);


命令
File.write("寫檔案");

目的

改善效能、擴充性、簡化

一般功能特性,多讀少寫。

改善效能:讀寫模型分離,讀模型降低框架使用,讀與寫不同資料庫,讀取資料擴可進行擴充,或是否是不同 連線方式 ,讀取使用JDBC原生程式,寫入使用ORM連線方式。

簡化:資料異動資料表與查詢資料表不同。

命令模型資料:學生、課程

Table
Column1
Column 2

課程

課程編號

分數

學生

姓名

學號

查詢模型資料表(每個學生最多兩個課程)

Table
Column1
Column 2
Column 3
Column 4
Column 5
Column 6

學生projection

姓名

學號

課程編號1

分數1

課程編號2

分數2

DDD

  • 命令EditPersonalInfoCommand

  • 查詢GetListQuery

  • 事件PersonalInfoChangedEvent

缺點:資料維護成為最大成本

投影:讀取資料模型與存取資料模型資料同步

  1. 事件驅動

    • 領域事件變更:

    • 訂閱追蹤領域事件(Event sourcing)

  2. 狀態驅動(透過狀態變更監聽 如:Hibernate :Event Listener)

    • 同步:反應速度快、增加處理時間、不容易拓展

    • 非同步:不會發生【阻斷】情況

範例

Last updated

Was this helpful?