

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# CQRS 模式
<a name="cqrs-pattern"></a>

命令查詢責任隔離 (CQRS) 模式會將資料變動或系統的命令部分與查詢部分分開。如果更新和查詢對輸送量、延遲或一致性的需求不同，您可以使用 CQRS 模式來分隔更新和查詢。CQRS 模式會將應用程式分成兩個部分：命令端和查詢端，如下圖所示。命令端會處理 `create`、 `update`和 `delete`請求。查詢端會使用僅供讀取複本執行該`query`部分。

![CQRS 模式的高階檢視](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/modernization-data-persistence/images/cqrs.png)


圖表顯示下列程序：

1. 企業會透過 API 傳送命令來與應用程式互動。命令是建立、更新或刪除資料等動作。

1. 應用程式會在命令端處理傳入的命令。這涉及驗證、授權和執行 操作。

1. 應用程式會將命令的資料保留在寫入 （命令） 資料庫中。

1. 在寫入資料庫中存放命令之後，會觸發事件來更新讀取 （查詢） 資料庫中的資料。

1. 讀取 （查詢） 資料庫會處理並保留資料。讀取資料庫旨在針對特定查詢需求進行最佳化。

1. 企業會與讀取 APIs 互動，將查詢傳送至應用程式的查詢端。

1. 應用程式會在查詢端處理傳入的查詢，並從讀取資料庫擷取資料。

您可以使用各種資料庫組合來實作 CQRS 模式，包括：
+ 針對 命令和查詢端使用關聯式資料庫管理系統 (RDBMS) 資料庫。寫入操作會移至主要資料庫，而讀取操作可以路由至僅供讀取複本。範例：[Amazon RDS 僅供讀取複本](https://aws.amazon.com/rds/features/read-replicas/)
+ 對命令端使用 RDBMS 資料庫，對查詢端使用 NoSQL 資料庫。範例：[使用事件來源和搭配 的 CQRS 來現代化舊版資料庫 AWS DMS](https://aws.amazon.com/blogs/database/modernize-legacy-databases-using-event-sourcing-and-cqrs-with-aws-dms/)
+ 對命令和查詢端使用 NoSQL 資料庫。範例：[使用 Amazon DynamoDB 建置 CQRS 事件存放區](https://aws.amazon.com/blogs/database/build-a-cqrs-event-store-with-amazon-dynamodb/)
+ 將 NoSQL 資料庫用於命令端，將 RDBMS 資料庫用於查詢端，如下列範例所述。

在下圖中，DynamoDB 等 NoSQL 資料存放區用於最佳化寫入輸送量並提供靈活的查詢功能。當您新增資料時，這可在具有明確定義存取模式的工作負載上實現高寫入可擴展性。Amazon Aurora 等關聯式資料庫提供複雜的查詢功能。DynamoDB 串流會將資料傳送至更新 Aurora 資料表的 Lambda 函數。

![使用 AWS 服務實作的 CQRS 模式](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/modernization-data-persistence/images/enabling-diagram3.png)


使用 DynamoDB 和 Aurora 實作 CQRS 模式可提供下列主要優點：
+ DynamoDB 是全受管 NoSQL 資料庫，可處理大量寫入操作，而 Aurora 可為查詢端的複雜查詢提供高讀取可擴展性。
+ DynamoDB 提供低延遲、高輸送量的資料存取，因此非常適合處理命令和更新操作，而且 Aurora 效能可以針對複雜的查詢進行微調和最佳化。
+ DynamoDB 和 Aurora 都提供無伺服器選項，讓您的企業僅根據用量支付資源費用。
+ DynamoDB 和 Aurora 是全受管服務，可減少管理資料庫、備份和可擴展性的操作負擔。

在以下情況下，您應該考慮使用 CQRS 模式：
+ 您已實作database-per-service模式，並想要聯結來自多個微服務的資料。
+ 您的讀取和寫入工作負載有不同的擴展、延遲和一致性需求。
+ 讀取查詢可接受最終一致性。

**重要**  
CQRS 模式通常會導致資料存放區之間的最終一致性。