CQRS架構

  命令查詢的責任分離Command Query Responsibility Segregation (簡稱CQRS)模式是一種架構體系模式,能夠使改變模型的狀態的命令和模型狀態的查詢實現分離。這屬于DDD應用領域的一個模式,主要解決DDD在數據庫報表輸出上處理方式。

  Greg Young在infoQ的采訪中“State Transitions in Domain-Driven Design”談到了CQRS,Greg 解釋了把領域模型分為兩種:狀態校驗,以及狀態轉換,維持當前狀態的一個視圖。

  在客戶端就將數據的CRUD的新增修改刪除CUD等操作和查詢R進行分離,前者稱為Command,走Command bus進入Domain對模型進行操作,而查詢則從另外一條路徑直接使用SQL對數據進行操作,比如報表輸出等,發揮SQL的特點。

  當一個Command進來時,從倉儲Repository加載一個聚合aggregate對象群,然后執行其方法和行為。這樣,會激發聚合對象群產生一個事件,這個事件可以分發給倉儲Repository,或者分發給Event Bus事件總線,比如JavaEE的消息總線等等。事件總線將再次激活所有監聽本事件的處理者。當然一些處理者會執行其他聚合對象群的操作,包括數據庫的更新。

下圖是開源JiveJdon的CQRS圖:

  在JiveJdon中,查詢數據庫是使用緩存,而寫入數據庫使用普通MySQL,兩者之間數據同步通過領域事件實現最終一致性。

  查詢與寫入數據庫的分離,可以實現專門為各自查詢 讀取而設計特別的數據表結構,專門為查詢進行優化。

  如果采取事件溯源EventSourcing,保存記錄的不是聚合當前狀態,而是導致狀態變化的事件日志 ,那么可以回放,從而找到重要狀態改變的軌跡與原因,這是從事件日志追溯來源。

  雖然這種架構有些復雜,但是好處卻很多,主要的是實現透明的分布式處理Transparent distributed processing,當使用事件作為狀態改變的引擎時,你可以通過實現多任務并發處理,比如通過JVM并行計算或事件消息總線機制,事件能夠很容易序列化,并在多個服務器之間傳送。而查詢操作則專門優化。

事件是一等公民

領域事件和EventSourcing

你的SOA已經使用了EDA和CQRS嗎?

Jdon分析法

 Jdon框架CQRS入門

DDD CQRS和Event Sourcing的案例:足球比賽

使用CQRS重新考慮架構

使用TRIMM 為EA項目產生基于Axon的CQRS代碼

Go 1.5的并發特性與案例(事件與轉賬)

日志是每個軟件工程師關心的統一數據抽象

依賴注入與事件編程

CQS問題?

DDD DCI和領域事件

Martin Fowler推薦的事件源Event Sourcing 架構:LMAX架構

DDD CQRS架構和傳統架構的優缺點比較

Lagom是一個集成ES/CQRS的Reactive微服務框架

如何理解Stream processing, Event sourcing, Reactive, CEP?

可擴展伸縮架構中的狀態

兩個領域事件驅動的開源項目介紹

CQRS解構

Saga與工作流引擎比較

最全面的CQRS和事件溯源介紹

經驗分享:采用事件溯源的誤區(以及我們是如何避免的)

在分布式事務失敗的情況下實現一致性:在線事件處理OLEP(事件溯源) - ACM權威

否定洋蔥或clean架構的垂直切片架構 - Jimmy Bogard

CQRS框架Axon框架指南 - Baeldung

#CQRS

相關專題:

#Actor模型 #EDA #領域事件 #EventSourcing? #分布式事務???

一级黄色录像影片 夫妻性生活影片 免费在线观看 一级a做爰片