

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# CQRS パターン
<a name="cqrs-pattern"></a>

コマンドクエリ責任分離 (CQRS) パターンは、データ変異、つまりシステムのコマンド部分をクエリ部分から分離します。スループット、遅延、または一貫性に関する要件が異なる場合は、CQRS パターンを使用して更新とクエリを分離できます。CQRS パターンは、以下の図に示されているように、アプリケーションをコマンド側とクエリ側の 2 つの部分に分けます。コマンド側は `create`、`update` と `delete` リクエストを処理します。クエリ側はリードレプリカを使用して `query` パーツを実行します。

![\[CQRS パターンの概要\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/modernization-data-persistence/images/cqrs.png)


図表に示す内容は以下のステップです。

1. 企業は API を介してコマンドを送信することで、アプリケーションとやり取りします。コマンドは、データの作成、更新、削除などのアクションです。

1. アプリケーションは、コマンド側で受信コマンドを処理します。これには、オペレーションの検証、承認、実行が含まれます。

1. アプリケーションは、コマンドのデータを書き込み (コマンド) データベースに保持します。

1. コマンドが書き込みデータベースに保存されると、イベントがトリガーされ、読み取り (クエリ) データベースのデータを更新します。

1. 読み取り (クエリ) データベースはデータを処理して保持します。読み取りデータベースは、特定のクエリ要件に合わせて最適化されるように設計されています。

1. 起業は読み取り API を操作して、アプリケーションのクエリ側にクエリを送信します。

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/ja_jp/prescriptive-guidance/latest/modernization-data-persistence/images/enabling-diagram3.png)


DynamoDB と Aurora を使用して CQRS パターンを実装すると、次の主な利点がもたらされます。
+ DynamoDB は、大量の書き込みオペレーションを処理できるフルマネージド NoSQL データベースであり、Aurora はクエリ側の複雑なクエリに対して高い読み取りスケーラビリティを提供します。
+ DynamoDB は、低レイテンシーで高スループットのデータへのアクセスを提供するため、コマンドおよび更新オペレーションの処理に最適です。Aurora のパフォーマンスは、複雑なクエリに合わせてファインチューニングおよび最適化できます。
+ DynamoDB と Aurora の両方にサーバーレスオプションが用意されているため、使用量のみに基づいてリソースの料金を支払うことができます。
+ DynamoDB と Aurora はフルマネージドサービスであり、データベース、バックアップ、スケーラビリティの管理に伴う運用上の負担を軽減します。

CQRS パターンの使用を検討すべきなのは、次のような場合です。
+ サービスごとのデータベースパターンを実装して、複数のマイクロサービスからのデータを結合したい場合。
+ 読み取りと書き込みワークロードには、スケーリング、レイテンシー、一貫性に関する個別の要件があります。
+ リードクエリの最終的な一貫性は許容範囲内です。

**重要**  
通常、CQRS パターンでは、最終的にデータストア間で一貫性が保たれます。