本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
CQRS 模式
命令查詢責任隔離(CQRS)模式將數據突變或系統的命令部分,與查詢部分分開。如果更新和查詢對輸送量、延遲或一致性有不同的需求,您可以使用 CQRS 模式來區隔更新和查詢。CQRS 模式將應用程序分成兩部分-命令側和查詢側-如下圖所示。命令側處理 create
update
,和delete
請求。查詢端會使用僅供讀取複本來執行query
零件。
該圖顯示了以下過程:
-
業務通過 API 發送命令與應用程序進行交互。命令是建立、更新或刪除資料之類的動作。
-
應用程序在命令側處理傳入的命令。這涉及驗證、授權和執行作業。
-
該應用程序將命令的數據保留在 write(命令)數據庫中。
-
命令存儲在寫入數據庫後,事件被觸發以更新 read(查詢)數據庫中的數據。
-
讀取 (查詢) 資料庫會處理並保留資料。讀取資料庫的設計目的是針對特定查詢需求進行最佳化。
-
業務與讀取 API 進行交互,以將查詢發送到應用程序的查詢端。
-
應用程序處理查詢端的傳入查詢,並從讀取的數據庫中檢索數據。
您可以通過使用數據庫的各種組合來實現 CQRS 模式,包括:
-
對於命令和查詢端使用關係數據庫管理系統(RDBMS)數據庫。寫入作業會移至主要資料庫,讀取作業可路由傳送至僅供讀取複本。範例:Amazon RDS 僅供讀取複本
-
使用 RDBMS 數據庫的命令端和 NoSQL 數據庫查詢端。範例:使用事件來源和 CQRS 將舊式資料庫現代化 AWS DMS
-
對於命令和查詢端使用 NoSQL 數據庫。範例:使用 Amazon DynamoDB 建立 CQRS 事件存放區
-
使用 NoSQL 數據庫的命令端和一個 RDBMS 數據庫查詢端,如下面的例子討論。
在下圖中,NoSQL 資料存放區 (例如 DynamoDB) 用於最佳化寫入輸送量並提供彈性的查詢功能。當您新增資料時,如此可在具有明確定義存取模式的工作負載上達到高寫入延展性。關聯式資料庫 (例如 Amazon Aurora) 可提供複雜的查詢功能。DynamoDB 串流會將資料傳送至可更新 Aurora 表的 Lambda 函數。
使用 DynamoDB 和 Aurora 實作 CQRS 模式可提供下列主要優點:
-
DynamoDB 是完全受控的 NoSQL 資料庫,可處理大量寫入作業,而 Aurora 為查詢端的複雜查詢提供高讀取延展性。
-
DynamoDB 提供低延遲、高輸送量的資料存取,因此非常適合處理命令和更新作業,而 Aurora 效能則可針對複雜的查詢進行微調和最佳化。
-
DynamoDB 和 Aurora 都提供無伺服器選項,讓您的企業僅根據使用情況支付資源費用。
-
DynamoDB 和 Aurora 是全受管服務,可減少管理資料庫、備份和延展性的操作負擔。
如果出現以下情況,您應該考慮使用 CQRS 模式:
-
您已實作 database-per-service 模式,並想要聯結來自多個微服務的資料。
-
您的讀取和寫入工作負載對擴展、延遲和一致性有不同的需求。
-
最終一致性是讀取查詢可以接受的。
重要
CQRS 模式通常會導致數據存儲之間的最終一致性。