ヒント
このコンテンツは、.NET Docs で入手できる、またはオフラインで読み取ることができる無料のダウンロード可能な PDF として入手できる、コンテナー化された .NET アプリケーションの電子ブックである .NET マイクロサービス アーキテクチャからの抜粋です。
CQRS は、データの読み取りと書き込みのモデルを分離するアーキテクチャ パターンです。 関連する用語 コマンドクエリ分離(CQS) は、もともと彼の本Object-Oriented ソフトウェア構築でベルトラン・メイヤーによって定義されました。 基本的な考え方は、システムの操作を 2 つの急激に分離されたカテゴリに分割できることです。
クエリ。 これらのクエリは結果を返し、システムの状態を変更せず、副作用はありません。
コマンド。 これらのコマンドは、システムの状態を変更します。
CQS は単純な概念です。これは、クエリまたはコマンドである同じオブジェクト内のメソッドに関する概念です。 各メソッドは状態を返すか、状態を変更しますが、両方は返しません。 単一のリポジトリ パターン オブジェクトでも、CQS に準拠できます。 CQS は CQRS の基本原則と考えることができます。
コマンドアンドクエリ責任分離(CQRS) はグレッグ・ヤングによって導入され、Udi Dahanなどによって強く促進されました。 CQSの原則に基づいていますが、より詳細にしています。 これは、コマンドとイベントに加えて、必要に応じて非同期メッセージに基づくパターンと見なすことができます。 多くの場合、CQRS は、読み取り (クエリ) 用と書き込み (更新) 用とは異なる物理データベースを持つなど、より高度なシナリオに関連しています。 さらに、より進化した CQRS システムでは、更新プログラム データベース のEvent-Sourcing (ES) が実装される可能性があるため、現在の状態データを格納するのではなく、ドメイン モデルにのみイベントを格納します。 ただし、このガイドではこの方法は使用されません。 このガイドでは、コマンドからクエリを分離するだけで構成される最も単純な CQRS アプローチを使用します。
CQRS の分離の側面は、1 つのレイヤーでクエリ操作をグループ化し、別のレイヤーのコマンドをグループ化することによって実現されます。 各レイヤーには独自のデータ モデルがあり (モデルとは言え、必ずしも異なるデータベースであるとは限りません)、独自のパターンとテクノロジの組み合わせを使用して構築されています。 さらに重要なのは、このガイドで使用する例 (マイクロサービスの順序付け) のように、2 つのレイヤーを同じ層またはマイクロサービス内に配置できることです。 または、異なるマイクロサービスまたはプロセスに実装して、互いに影響を与えずに個別に最適化およびスケールアウトすることもできます。
CQRS は、読み取り/書き込み操作用に 2 つのオブジェクトを持つことを意味します。他のコンテキストには 1 つがあります。 非正規化された読み取りデータベースを使用する理由があります。これは、より高度な CQRS 文献で学習できます。 ただし、ここではそのアプローチを使用していません。ここでの目標は、集計などの DDD パターンからの制約を使用してクエリを制限するのではなく、クエリの柔軟性を高めるということです。
この種のサービスの例として、eShopOnContainers 参照アプリケーションからのマイクロサービスの注文があります。 このサービスは、簡略化された CQRS アプローチに基づいてマイクロサービスを実装します。 図 7-2 に示すように、1 つのデータ ソースまたはデータベースが使用されますが、トランザクション ドメインには 2 つの論理モデルと DDD パターンが使用されます。
図 7-2 簡略化された CQRS および DDD ベースのマイクロサービス
論理 "順序付け" マイクロサービスには、順序付けデータベースが含まれています。これは、同じ Docker ホストである可能性がありますが、そうである必要はありません。 データベースを同じ Docker ホストに含めるのは開発には適していますが、運用環境には適していません。
アプリケーション レイヤーは、Web API 自体にすることができます。 ここでの重要な設計の側面は、マイクロサービスが CQRS パターンに従ってコマンド、ドメイン モデル、およびトランザクションからクエリと ViewModel (特にクライアント アプリケーション用に作成されたデータ モデル) を分割していることです。 この方法では、後のセクションで説明するように、トランザクションと更新に対してのみ意味がある DDD パターンからの制限や制約とは関係なくクエリを保持します。
その他のリソース
- Greg Young。 イベント ソース システムでのバージョン管理 (オンライン電子書籍を無料で読む)
https://leanpub.com/esversioning/read
.NET