CQRS架構和Axon框架入門實踐

Rickie發表於2021-07-04
CQRS(Command Query Responsibility Separation,命令查詢職責分離)最早來自於Betrand Meyer(Eiffel語言之父,OCP提出者)提出的概念。其基本思想在於,任何一個物件的方法可以分為兩大類:
  • 命令(Command):不返回任何結果(void),但會改變物件的狀態。
  • 查詢(Query):返回結果,但是不會改變物件的狀態,對系統沒有副作用。
 
CQRS 中的命令這方面最重要的部分包括:
  • 命令(Command),它負責捕獲使用者的意圖,即接下來應該發生什麼事。
  • 命令處理器(Command Handler),它負責執行所傳送的命令。
  • 命令匯流排(Command Bus),負責將命令傳遞給對應的命令處理器。
CQRS架構和Axon框架入門實踐
從架構圖上來看,CQRS 的實現似乎並不難,許多開發者覺得無非是「增刪改」一套系統一個資料庫,「查詢」一個系統一個資料庫而已,有點類似「讀寫分離」,並沒有什麼特別的地方。但是真正要使用 CQRS 是有許多問題與細節要解決的。
 
使用CQRS的一個問題是尋找一個成熟易用的框架。Axon 可能算一個。
CQRS架構和Axon框架入門實踐
Axon是一個輕量級的Java開源框架,可以幫助構建你構建基於CQRS模式的可伸縮、可擴充套件和可維護的Java應用程式。它還可以幫助你準備事件溯源(Event Sourcing)所需要的環境。Axon提供了所有重要構建模組的實現,如聚合、儲存庫,命令和時間匯流排。Axon可以讓開發人員的工作更為輕鬆。
 
CQRS 在 DDD 中是一種常常被提及的模式,它的用途在於將領域模型與查詢功能進行分離,讓一些複雜的查詢擺脫領域模型的限制,以更為簡單的 DTO 形式展現查詢結果。同時分離了不同的資料儲存結構,讓開發者按照查詢的功能與要求更加自由地選擇資料儲存引擎。
 
同樣的,CQRS 在帶來架構自由與便利的同時也不可避免地引入了額外的複雜性與技能要求,例如對於分散式事務,訊息中介軟體的管理,資料模型的設計等等,所以在引入 CQRS 之前需要對團隊能力與現有架構做仔細的分析,對短板進行必要的提升。如果現有系統邏輯較為簡單,只是一些 CRUD,那麼並不建議使用 CQRS。但是如果你的業務系統已經非常龐大,業務流程龐雜,邏輯繁瑣,那麼不妨嘗試使用 CQRS 將 Command 與 Query 進行拆分,將領域模型與資料模型的邊界劃分得更清晰些。

相關文章