CQRSは高い拡張性と性能を要求されるアプリケーションに適したパターンとして人気を獲得し始めている。Mark Seemann氏は“CQRS On Windows Azure”と題した記事で、このパターンをWindows Azureで使う方法を探っている。
CQRSはCommand Query Responsibility Segregationの略だ。このパターンは情報の更新と情報の読み取りを違うモデルで実行するという考えに基づいている。この考えを採用すれば、読み取りと書き込みの扱いを別にでき、異なるデータベースや異なるデータアクセス技術を利用できる。また、Eventual consistencyやEvent Sourcingといったアーキテクチャパターンを利用できる。この記事の要点は、
- 表示されているデータは既に古いと仮定する。UIは期待される値を正しくセットするために使う(例えば、スクリーン上のデータは何の保証にもならない)。
- UIからのリクエストを処理しつつ、コマンドを作成し、(キューへ)送信して結果を可能な限り早く返す。Windows Azureの場合、Storageキュー上にChannelを実装することで実現する。
- Workerロールを分離することで、UIから送信されたコマンドメッセージを取り出し、処理する。
- 書き込みの冪等性を担保し、メッセージが複数回再送されてもデータがおかしくならないようにする。
- Optimistic Concurrencyを利用する。Windows AzureではEtags(CloudBlob.Properties.ETag)を使うことで実現できる。
- ビューデータの更新は異なるChannelを使って非同期で行う。はコントローラがこのChannelに問い合わせる。
- 読み取りデータは非正規化にして、性能を改善する。
CQRS全般について調べるにはRinat Abdullin氏CQRSの紹介ページが便利だ。また、Martin-Fowler氏のエッセイやArunava Chatterji氏が書いたInfoQの記事“Healthy Architecturesも参考されたい。