【しーきゅーあーるえす】

CQRS とは?

💡 「書く」と「読む」を完全に分ける
📌 このページのポイント
CQRS パターン(Command Query Responsibility Segregation) Command(書込) Query(読取) クライアント Command Handler ドメインモデル Write DB 正規化モデル Sync / Event クライアント Query Handler 読取専用モデル Read DB 非正規化ビュー 書込と読取を分離 → それぞれ最適なモデル・スケーリングが可能
CQRS パターンのイメージ
ひよこ ひよこ

なぜ読み書きを分ける必要があるの?

ペンギン先生 ペンギン先生

多くのシステムは読み取りが書き込みの10〜100倍。同じモデルで両方を最適化するのは難しい。書き込みは正規化されたテーブルが適切だけど、読み取りは非正規化された読み取り専用ビューの方が速い。CQRSなら書き込みモデルはデータの整合性を、読み取りモデルはクエリの高速性を、それぞれ独立して最適化できるんだよ

ひよこ ひよこ

具体的にはどう構成するの?

ペンギン先生 ペンギン先生

シンプルなCQRS:同じDB内で書き込み用テーブルと読み取り用ビューを分ける。フルCQRS:書き込みDBと読み取りDBを物理的に分離。書き込みイベントが発生したら、イベントハンドラーが読み取りDBを更新する。結果整合性になるけど、読み取り側を自由にスケールアウトできるよ

ひよこ ひよこ

いつCQRSを使うべき?

ペンギン先生 ペンギン先生

①読み取りと書き込みのスケール要件が大きく異なる場合、②複雑なドメインで読み取りモデルと書き込みモデルが大きく乖離する場合、③イベントソーシングを採用する場合。シンプルなCRUDアプリにCQRSは不要。複雑さが増すから「本当に必要か」を慎重に判断してね

ひよこ ひよこ

イベントソーシングとの関係は?

ペンギン先生 ペンギン先生

イベントソーシングは全ての変更をイベントとして記録する。でもイベントの積み上げから現在の状態を読み取るのは遅い。CQRSの読み取りモデルをイベントから構築(プロジェクション)すれば、高速な読み取りが可能になる。イベントソーシング+CQRSは相性が良い組み合わせだよ

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「CQRS」って出てきたら「書き込みと読み取りのモデルを分離するパターン」と思えればだいたいOK!
📖 おまけ:英語の意味
「Command Query Responsibility Segregation」 = コマンドクエリ責務分離
💬 Command(命令=書き込み)とQuery(問い合わせ=読み取り)のResponsibility(責務)をSegregate(分離)するよ
← 用語集にもどる