CQRS(コマンドクエリ責務分離)
定義
CQRS(Command Query Responsibility Segregation)とは、システムの操作を**コマンド(書き込み)とクエリ(読み取り)**の2つの責務に分離するパターン。
- コマンドモデル(Write Model):状態を変更する。ドメインモデル(集約、エンティティ)を使い、整合性・ビジネスルールを保証する
- クエリモデル(Read Model):状態を返す。画面表示に最適化されたデータ構造(DTO、View)を返す。整合性より読み取り速度を優先する
Command → WriteService → Domain Model → DB(書き込み)
Query → ReadService → Query Model → DB(読み取り最適化済みビュー)
なぜ重要か
単一モデルで読み書きを両立しようとすると:
- 読み取り用のフィールドが書き込みモデルを複雑にする
- 読み取りのためにJOINや集計を行うと書き込みのトランザクションが重くなる
- 読み取りのスケールアウトと書き込みの整合性を同時に最適化できない
CQRSにより:
- 読み取りモデルは非正規化・キャッシュ・専用DBで自由に最適化できる
- 書き込みモデルはドメインルールの保護に集中できる
適用場面
- 読み取りと書き込みのアクセスパターンが大きく異なるシステム
- ドメインイベントで書き込みモデルから読み取りモデルを非同期更新するとき
- 大規模な読み取り要求と厳密な整合性が求められる書き込みが共存するとき
注意点
CQRSは複雑性を増す。単純なCRUDアプリケーションには過剰設計になる。コアドメインや高負荷が予想される部分に限定して採用するべき。
関連概念
出典
実践ドメイン駆動設計(Vaughn Vernon)第4章 / Greg Young “CQRS Documents”