什麼是 CQRS?它在微服務中有多重要?

banq發表於2022-08-12

CQRS 是一種微服務架構模式,它代表命令和查詢責任分離。
這種模式背後的基本思想是將寫操作與讀操作分開。不是使用一個資料儲存來執行 CRUD 操作,而是在一個資料儲存上執行讀取操作,並在不同的資料儲存上執行建立/更新。
CQRS 承諾對大規模應用程式的穩定性和可擴充套件性以及顯著的效能改進。
CQRS 模式由 Bertrand Meyer 設計,作為開發 Eiffel 程式語言的一部分。Greg Young 創造了“CQRS”一詞。


CQRS 在哪裡使用?
CQRS 通常在準備就緒的大規模分散式應用程式中是首選。也就是說,如果應用程式中的讀取次數遠遠超過寫入操作的次數。
此模式的另一個合適用例是讀取操作繁重且資料儲存副本可以放置在應用程式接收高流量的地理位置附近,從而提高資料庫讀取操作的效能。


CQRS 是如何實現的?
到目前為止,我們知道要實現 CQRS,我們將使用兩個資料儲存庫。
通常,寫入操作首選關聯式資料庫,其中可以應用所有資料約束,並使用NoSQL 資料庫支援讀取操作。這意味著,兩種不同的資料模型用於寫入和讀取操作。
自然,人們會想到的問題是這兩個儲存庫中的資料如何同步?
這就是事件驅動架構出現的地方。


考慮一個使用者呼叫POST API的場景,執行一些驗證,然後將資料及其約束更新到我們的關聯式資料庫中。
將資料插入資料庫後,將呼叫觸發器,該觸發器將更新所有事件處理程式(事件驅動架構)以更新讀取的資料庫。
當另一個使用者呼叫 GET API 時,應用程式將從NoSQL 資料庫中檢索相關資料並將其傳送回使用者。用於實現 CQRS 的最流行的基於 Java 的框架是 Axon。
Axon 使用命令和處理程式來呼叫和處理相應的事件。你可以在Github上找到完整的程式碼。

使用 CQRS 有什麼好處?
使用 CQRS 的主要好處包括:

  1. 靈活的擴充套件——讀寫資料儲存可以根據需求獨立擴充套件。
  2. 簡單查詢——由於讀取和寫入的資料模型是分開的,讀取資料模型可以設計成避免複雜查詢的方式。
  3. 提高效能——透過最佳化讀取操作並將資料儲存副本放置在不同的地理位置,讀取繁重的操作可以顯著提高效能。

使用 CQRS 的缺點是什麼?
  1. 複雜性——事件驅動的系統構建和維護起來很複雜。儘管有像 Axon 這樣的框架可以處理資料庫寫入、釋出事件和通知各種處理程式,但也有讀寫模型不同步的情況。
  2. 一致性——CQRS 和事件驅動架構旨在確保資料在所有涉及的系統中保持一致,但在訊息失敗的情況下,讀取資料庫將不同步。


 結論
在讀取次數遠大於寫入次數的情況下,CQRS 是一種需要考慮的模式。特別是在讀取操作要高度最佳化並且不需要執行任何業務邏輯或驗證的情況下。讀取操作就像獲取資料、載入 DTO 並將其傳遞給客戶端一樣簡單。
實現這樣一個系統的最大挑戰是確保避免資料重複,讀取資料庫永遠不會過時,並且寫入資料庫的所有條目最終也會在讀取資料庫中一致地更新。
儘管從概念上講,這聽起來很簡單,但 CQRS 並不那麼容易實現和除錯。

相關文章