コマンドクエリ責任分離コマンドクエリ責任分離(コマンドクエリせきにんぶんり、英語: Command Query Responsibility Segregation, CQRS)とは、情報技術において、データの更新処理を行うインターフェースと、データの取得処理を行うインターフェースを分離するシステムアーキテクチャである。 概要CQRSは、コマンドクエリ分離(CQS)の背景にあるアイデアをサービスのレベルにまで拡張させたもので[1][2]、コマンドクエリ分離と同様に、クエリはデータの状態を取得するだけでログ書き込みなどの例外を除きシステムの状態を変化させず、コマンドはシステムの状態を変化させる。 データを更新する操作とそれに用いられるオブジェクトをコマンドといい、データの取得操作をクエリという。コマンド操作で用いられるデータモデルをコマンドモデル、書き込みモデル[3]、コマンド実行モデル[4]などといい、クエリ操作で用いられるデータモデルをクエリモデル、読み取りモデル[3]、リードモデルなどという[5][6]。 利用単純なCRUD処理の場合、データの更新とデータの読み取りに同じデータモデルを用いることが適しているが[3]、読み取り側と更新側でスループット、遅延、一貫性などに関する要件が異なる場合には、CQRSを用いることが有用である場合がある[7]。 CQRSにおいては、クエリは、キャッシュや検索インデックスなどを用いることによってデータの読み取りに特化したデータストアを参照することが多くある。また、コマンドの実行がクエリ呼び出しに対して非同期であり、クエリを呼び出した時点で直近のコマンド処理が終了しておらず、データが最新のものに更新されていない(結果整合性)ということは珍しくない。これを解消するために、コマンドを送信したユーザ側でUIの整合性をとるという処理がよく行われるとされる[8][6][9]。 イベントソーシングはCQRSと共に発表されたアイデアであり[10]、多くの場合CQRSを用いて実装される[11]。イベントソーシングはアプリケーションの状態の表現方法の一つであり、状態を永続化するステートソーシングに対して、アプリケーションの状態にどのような変更があったかというイベント履歴を永続化する[12]。イベントソーシングではイベント履歴からアプリケーションの最新の状態を得るために一定の計算が必要になるが、イベントを登録する際に事前にCQRSにおけるリードモデル側で参照するデータを更新しておくというアプローチを取ることができる。このように、読み取り側が参照する情報をデータの更新時に事前に計算しておくというアプローチのことを、Eager Read Derivationという[10]。 他のアーキテクチャパターンとの関係マーティン・ファウラーは以下のように述べている[13]。
関連項目参考文献
外部リンク |
Portal di Ensiklopedia Dunia