CQRS 的最初需求
多年來,傳統的 CRUD(創建、讀取、更新、刪除)模式一直是系統架構的支柱。在 CRUD 中,讀取和寫入操作通常由相同的數據模型和相同的數據庫模式處理。雖然這種方法簡單直觀,但隨著系統規模的擴大和需求變得更加復雜,它的效率就會降低。
例如,考慮一個擁有數百萬用戶的大型電子商務應用程序。該系統可能面臨相互沖突的需求:它需要快速讀取產品詳細信息、評論和用戶配置文件,但它還必須有效處理數千筆交易、庫存更新和訂單下達。隨著讀取和寫入操作的增長,對兩者使用單一模型可能會導致瓶頸,影響性能和用戶體驗。
CQRS 模式的基礎知識
CQRS 的引入是為了解決這些擴展挑戰。該模式的本質就在于它的名字——命令查詢職責分離。在這里,命令負責系統狀態的任何更改(例如下訂單或更新用戶配置文件),而查詢則處理數據檢索,沒有任何副作用。
在 CQRS 系統中,這兩個操作被視為完全不同的職責,通常具有單獨的數據模型、數據庫,甚至單獨的服務器或服務。這使得每個操作都可以獨立于另一個進行調整、縮放和維護,并與每個操作的特定需求保持一致。
CQRS 組件
命令
命令是在系統內執行操作或更改的指令組件。它們的命名應反映意圖和上下文,例如PlaceOrder或UpdateUserProfile。重要的是,命令應該負責更改,因此不應返回數據。進一步探索命令如何處理驗證、授權和業務邏輯將闡明它們在 CQRS 模式中的角色。
查詢
另一方面,查詢處理所有數據請求操作。重點可能在于如何構建這些來提供針對特定用例定制的優化的、非規范化的數據視圖。您可以深入研究構建和優化查詢服務的不同策略,以處理潛在的復雜讀取模型。
命令和查詢處理程序
處理程序充當促進命令和查詢執行的代理。命令處理程序負責執行與數據突變相關的邏輯,同時確保遵守驗證和業務規則。查詢處理程序管理數據的檢索,可能涉及復雜的聚合或連接以形成請求的讀取模型。
單數據庫與雙數據庫方法
單一數據庫
在此模型中,命令和查詢操作都在單個數據庫上執行,但具有不同的模型或模式。即使這兩個操作共享相同的物理存儲,它們也可能使用針對其特定要求而優化的不同表、視圖或索引。
它可以表示如下:
好處
-
簡化基礎設施并減少開銷
-
立即一致性,因為寫入和讀取操作之間沒有延遲
權衡
-
在大量并發操作期間,共享資源仍然可能成為瓶頸。
-
獨立調整和縮放操作的靈活性較低
雙數據庫方法
在這里,命令和查詢操作完全分開,使用兩個不同的數據庫或存儲系統。寫數據庫專用于處理命令,而讀數據庫則服務于查詢操作。必須添加手柄同步系統。
它可以表示如下:
好處
-
每個操作的單獨調整、縮放和優化
-
每個數據庫有可能托管在不同的服務器或服務上,分配負載;數據庫解決方案也可能有所不同,以便為特定需求提供更多的模塊化。
權衡
-
為確保兩個數據庫之間的數據一致性帶來了復雜性
-
需要同步機制來橋接寫入和讀取數據庫之間潛在的錯位或延遲:例如,寫入操作可能會更新命令數據庫,但讀取數據庫可能不會立即反映這些更改。為了解決這個問題,同步技術的范圍可以從簡單的輪詢到更復雜的方法,例如事件源,其中修改被捕獲為一系列事件并重放以更新讀取的數據庫。
單一數據庫方法提供了簡單性;雙數據庫配置提供了更大的靈活性和可擴展性,但代價是增加了復雜性。這些方法之間的選擇取決于相關系統的具體要求和挑戰,特別是圍繞性能需求和一致性要求。
CQRS 模式的優點和權衡
好處
-
性能優化:通過分離讀寫邏輯,可以獨立擴展和優化各個方面。例如,如果系統讀取量很大,您可以分配更多資源來處理查詢,而不會因寫入操作的需求而陷入困境。
-
靈活性和可擴展性:通過單獨的讀取和寫入模型,可以更輕松地在一個模型中引入更改,而不會影響另一個模型。這種隔離不僅可以實現更敏捷的開發和更輕松的可擴展性,還可以針對與急切實體加載相關的常見問題提供保護。通過明確地處理讀取和寫入,可以優化系統以避免不必要的數據加載,從而提高性能并減少資源消耗。
-
簡化的代碼庫:分離命令和查詢邏輯可以使代碼庫更易于維護且不易出錯。每個模型都有明確的職責,減少了由于相互交織的邏輯而引入錯誤的可能性。
權衡
-
數據一致性:由于讀寫模型可能不同,實現數據一致性可能具有挑戰性。CQRS 通常與“最終一致性”模型齊頭并進,這可能并不適合所有應用程序。
-
復雜性開銷:引入 CQRS 會增加復雜性,尤其是與事件溯源等其他模式配合使用時。評估所獲得的好處是否超過增加的復雜性至關重要。
-
增加開發工作量:擁有獨立的讀寫模型本質上意味著維護系統的兩個不同部分。這會增加初始開發工作量以及持續的維護開銷。
結論
CQRS 提供了一種變革性的數據管理方法,在性能、可擴展性和代碼清晰度方面帶來了顯著的優勢。然而,這并不是靈丹妙藥。與所有架構決策一樣,采用 CQRS 應該是一個經過深思熟慮的選擇,要考慮到它的好處和它帶來的挑戰。對于可擴展性和性能至關重要且可以接受權衡的系統,CQRS 可以改變游戲規則,將系統的穩健性和響應能力提升到新的高度。
作者:Artem Artemev
更多技術干貨請關注公號【云原生數據庫】
squids.cn,云數據庫RDS,遷移工具DBMotion,云備份DBTwin等數據庫生態工具。
irds.cn,多數據庫管理平臺(私有云)。