Command Query Responsibility Segregation (CQRS)に関するアーキテクチャやパターンについて理解を深めるため、Sacha Barber氏はCQRSのデモアプリケーションを開発することに決めた。このアプリは、イベントソーシングも活用しており、記事で解説がされている。
Microsoft C# MVPであるBarber氏は、CQRSについて、副作用無しのクエリや読み取りアクセスの責務をコマンドの入力の処理の責務から分離する、ということだと考えている。氏の例では、書き込みと読み取りのモデルでそれぞれ、モデルとストレージを分離している。これは、Vladimir Khorikov氏が以前にCQRSの第3タイプとして定義したものだ。Barber氏はイベントソーシングについて、アプリケーションの状態の中の変更の保存を、現在状態だけではなく、イベントの連続として実現する。オブジェクトの現在の状態を取得するには、すべてのイベントは検索され、オブジェクトの連続として扱われる。これによって、イベントを再現することで、過去の状態を再現したり、遡及的な変更によって状態を調整できる。
イベントベースの書き込みモデルとふたつのモデルでの分離したストレージでは、読み取りモデルが書き込み側のイベントで更新される。これを非同期で実現するには、コマンドによる状態の変更は、続く読み取りには即時に反映されないかもしれない。Barber氏によれば、このデモアプリケーションは現在、結果整合性を保持している。氏によれば、この典型的なCQRSの実装はリクエスト/レスポンス型のオペレーションには向かない。つまり、ユーザが即時に正確なレスポンスを期待している場合には適さない。Barber氏によれば、ユーザの視点から見たコマンドがクエリから明確に分離されている場合が、CQRSに適したユースケースだ。
CQRSへの理解を深めるために、氏は.NETで完全なデモアプリを開発した。このアプリは、読み取りと書き込みの非同期アプローチを実現するために、RabbitMQを利用している。シンプルにするため、氏はインメモリのモデルを使っている、従って、イベントは実行期間中は永続化されない。氏のアプリケーションは、コマンドバス、ドメイン、イベントストア、イベントバス、NoSQLデータベース、イベントハンドラ、データレイヤでできている。
CQRSフレームワークは邪魔になるという意見は一般的だが、氏は経験不足を補うため、CQRSliteを使っている。CQRSliteはGreg Young氏が開発した古いフレームワークの拡張だ。
Barber氏のデモアプリケーションは、GitHubからダウンロードできる。