CQRSとは?
CQRS(Command Query Responsibility Segregation、コマンドクエリ責務分離)は、データの更新に使うモデルと、読み取りに使うモデルを分ける考え方です。 書き込み側は業務ルールに集中し、読み取り側は表示や検索に適した形で情報を整理します。
たとえば、映画のチケットを予約するには座席の空き状況を確認する必要があります。チケットを一覧表示するには、映画名、上映時刻、座席の位置が必要です。どちらも同じデータに関わりますが、必要な処理は異なります。
CQRS(Command Query Responsibility Segregation、コマンドクエリ責務分離)は、データの更新に使うモデルと、読み取りに使うモデルを分ける考え方です。 書き込み側は業務ルールに集中し、読み取り側は表示や検索に適した形で情報を整理します。
たとえば、映画のチケットを予約するには座席の空き状況を確認する必要があります。チケットを一覧表示するには、映画名、上映時刻、座席の位置が必要です。どちらも同じデータに関わりますが、必要な処理は異なります。
両方のモデルを同じアプリケーションに置き、データベースを共有することもできます。CQRSに、二つのデータベース、キュー、イベントソーシングは必須ではありません。
顧客が座席を選ぶと、リクエストは書き込み側に送られます。システムは予約を確認して保存します。このとき、適切なデータ制約を備えたトランザクションで、二人の顧客が同じ上映回の同じ座席を予約することを防ぐ必要があります。書き込みが成功すると、顧客に予約確認が返されます。
顧客が「マイチケット」を開くと、読み取り側は映画名、上映時刻、座席を含む一覧を返します。予約のルールを変えずに、この一覧の見せ方を変更できます。
クエリの処理コストが高くなった場合、これらの情報をあらかじめまとめた別の読み取り用テーブルを維持できます。そのテーブルを非同期に更新する場合、新しいチケットがすぐに表示されないことがあります。そのため、画面は一覧を更新している間も、予約成功の確認を保持する必要があります。
CQRSは、更新に多くの業務ルールがある一方、画面やレポートでは大きく異なるデータ表現が必要な場合に役立ちます。システム全体ではなく、チケット予約の部分だけに適用することもできます。
単純なレコードの作成、読み取り、更新、削除を行うだけのアプリケーションでは、一つのモデルを共有する方が開発しやすいことが多いです。
ジュニアからシニアまで、詳細な回答付きのIT面接質問ライブラリ。
寄付する