

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

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

命令查询责任分割 (CQRS) 模式将数据突变或系统的命令部分与查询部分分开。如果更新和查询对吞吐量、延迟或一致性的要求不同，则可以使用 CQRS 模式将其分开。如下图所示，CQRS 模式将应用程序分为两部分：命令端和查询端。命令端处理 `create`、`update`、和 `delete` 请求。查询端使用只读副本来运行 `query` 部分。

![CQRS 模式概要视图](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/modernization-data-persistence/images/cqrs.png)


此图显示以下流程：

1. 企业会通过 API 发送命令，以便与应用程序交互。命令是创建、更新或删除数据之类的操作。

1. 应用程序会在命令端处理传入的命令。这包括验证、授权和运行操作。

1. 应用程序会将命令的数据保存在写入（命令）数据库中。

1. 命令存储到写入数据库后，将触发事件以更新读取（查询）数据库中的数据。

1. 读取（查询）数据库将处理并保留数据。读取数据库旨在针对特定查询需求进行优化。

1. 业务与 read 交互 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 数据库。

在下图中，NoSQL 数据存储（例如 DynamoDB）用于优化写入吞吐量并提供灵活的查询功能。因此，在添加数据时，就能在具有明确定义的访问模式的工作负载上实现较高的写入可扩展性。Amazon Aurora 等关系数据库可提供复杂的查询功能。DynamoDB 流将数据发送到更新 Aurora 表的 Lambda 函数。

![使用服务实现的 CQRS 模式 AWS](http://docs.aws.amazon.com/zh_cn/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 模式通常会在数据存储之间实现最终一致性。