翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
CQRS パターン
コマンドクエリ責任分離 (CQRS) パターンは、データ変異、つまりシステムのコマンド部分をクエリ部分から分離します。スループット、遅延、または一貫性に関する要件が異なる場合は、CQRS パターンを使用して更新とクエリを分離できます。CQRS パターンは、次の図に示すように、アプリケーションをコマンド側とクエリ側の 2 つの部分に分割します。コマンド側は create
、update
と delete
リクエストを処理します。クエリ側はリードレプリカを使用して query
パーツを実行します。

図表に示す内容は以下のステップです。
-
ビジネスは API を介してコマンドを送信することで、アプリケーションとやり取りします。コマンドは、データの作成、更新、削除などのアクションです。
-
アプリケーションは、コマンド側で受信コマンドを処理します。これには、オペレーションの検証、承認、実行が含まれます。
-
アプリケーションは、コマンドのデータを書き込み (コマンド) データベースに保持します。
-
コマンドが書き込みデータベースに保存されると、イベントがトリガーされ、読み取り (クエリ) データベースのデータを更新します。
-
読み取り (クエリ) データベースはデータを処理して保持します。読み取りデータベースは、特定のクエリ要件に合わせて最適化されるように設計されています。
-
ビジネスは読み取り APIs とやり取りして、アプリケーションのクエリ側にクエリを送信します。
-
アプリケーションは、クエリ側で受信クエリを処理し、読み取りデータベースからデータを取得します。
CQRS パターンは、次のようなデータベースのさまざまな組み合わせを使用して実装できます。
-
コマンド側とクエリ側の両方でリレーショナルデータベース管理システム (RDBMS) データベースを使用する。書き込みオペレーションはプライマリデータベースに送信され、読み取りオペレーションはリードレプリカにルーティングできます。例: Amazon RDS リードレプリカ
-
コマンド側には RDBMS データベースを使用し、クエリ側には NoSQL データベースを使用します。例: でイベントソーシングと CQRS を使用してレガシーデータベースをモダナイズする AWS DMS
-
コマンド側とクエリ側の両方で NoSQL データベースを使用する。例: Amazon DynamoDB を使用して CQRS イベントストアを構築する
-
次の例で説明するように、コマンド側には NoSQL データベースを使用し、クエリ側には RDBMS データベースを使用します。
次の図では、DynamoDB などの NoSQL データストアを使用して書き込みスループットを最適化し、柔軟なクエリ機能を提供しています。これにより、データを追加するときのアクセスパターンが明確に定義されているワークロードでも、高い書き込みスケーラビリティを実現できます。Amazon Aurora などのリレーショナルデータベースは、複雑なクエリ機能を提供します。DynamoDB ストリームは、Aurora テーブルを更新する Lambda 関数にデータを送信します。

DynamoDB と Aurora で CQRS パターンを実装すると、次の主な利点があります。
-
DynamoDB は、大量の書き込みオペレーションを処理できるフルマネージド NoSQL データベースであり、Aurora はクエリ側の複雑なクエリに対して高い読み取りスケーラビリティを提供します。
-
DynamoDB は、低レイテンシーで高スループットのデータへのアクセスを提供するため、コマンドおよび更新オペレーションの処理に最適です。Aurora のパフォーマンスは、複雑なクエリ用に微調整および最適化できます。
-
DynamoDB と Aurora の両方にサーバーレスオプションが用意されているため、ビジネスは使用量のみに基づいてリソースの料金を支払うことができます。
-
DynamoDB と Aurora はフルマネージドサービスであり、データベース、バックアップ、スケーラビリティを管理する運用上の負担を軽減します。
次の場合は、CQRS パターンの使用を検討する必要があります。
-
サービスごとのデータベースパターンを実装して、複数のマイクロサービスからのデータを結合したい場合。
-
読み取りと書き込みワークロードには、スケーリング、レイテンシー、一貫性に関する個別の要件があります。
-
リードクエリの最終的な一貫性は許容範囲内です。
重要
通常、CQRS パターンでは、最終的にデータストア間で一貫性が保たれます。