CQRS パターン - AWS 規範ガイダンス

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

CQRS パターン

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

CQRS パターンの概要

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

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

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

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

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

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

  6. ビジネスは読み取り APIs とやり取りして、アプリケーションのクエリ側にクエリを送信します。

  7. アプリケーションは、クエリ側で受信クエリを処理し、読み取りデータベースからデータを取得します。

CQRS パターンは、次のようなさまざまなデータベースの組み合わせを使用して実装できます。

次の図では、DynamoDB などの NoSQL データストアを使用して書き込みスループットを最適化し、柔軟なクエリ機能を提供しています。これにより、データを追加するときのアクセスパターンが明確に定義されているワークロードでも、高い書き込みスケーラビリティを実現できます。Amazon Aurora などのリレーショナルデータベースは、複雑なクエリ機能を提供します。DynamoDB ストリームは、Aurora テーブルを更新する Lambda 関数にデータを送信します。

AWS サービスで実装される CQRS パターン

DynamoDB と Aurora で CQRS パターンを実装すると、次のような主な利点があります。

  • DynamoDB は、大量の書き込み操作を処理できるフルマネージド NoSQL データベースであり、Aurora はクエリ側の複雑なクエリに対して高い読み取りスケーラビリティを提供します。

  • DynamoDB は、低レイテンシーで高スループットのデータアクセスを提供するため、コマンドおよび更新オペレーションの処理に最適です。Aurora のパフォーマンスは、複雑なクエリ向けに微調整および最適化できます。

  • DynamoDB と Aurora の両方にサーバーレスオプションが用意されているため、ビジネスは使用状況のみに基づいてリソースに対して料金を支払うことができます。

  • DynamoDB と Aurora はフルマネージドサービスであり、データベース、バックアップ、スケーラビリティの管理に伴う運用上の負担を軽減します。

次の場合は、CQRS パターンの使用を検討する必要があります。

  • database-per-service パターンを実装し、複数のマイクロサービスのデータを結合したいと考えています。

  • 読み取りと書き込みワークロードには、スケーリング、レイテンシー、一貫性に関する個別の要件があります。

  • リードクエリの最終的な一貫性は許容範囲内です。

重要

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