CQRS と Event Sourcing
DDD から派生した、読み書きを分離するアーキテクチャパターン。_moc-web-infra
CQRS (Command Query Responsibility Segregation)
サーバの機能を明示的に2つに分ける戦略。
- コマンド: 副作用あり、write
- クエリ: 副作用なし、read、スケーラブル
「情報の参照に使うモデルと更新に使うモデルに異なるものを使う」。 - 更新系モデル(Entity/ValueObject)は Repository を介し、参照系モデル(DTO)は専用の
QueryServiceで取得する。集約をまたいだDTOを扱いやすくなり、画面寄りになる。 - DBを分けることもある: read が多い場合 read replica でスケール。更新の同期は非同期 or 同期(同期だとtxが分かれるため Two-Phase Commit 等)。
- graphql はこの発想と親和的。
Event Sourcing
ドメインで発生したイベントを他ドメインに供給するパターン。状態そのものではなくイベント列を記録し、再生して状態を得る。CQRS のデータ同期手段として併用されることが多い。DynamoDB Streams 等で実装できる(nosql-databases)。
実例
一休はPython・ORMを使わず dataclass + Data Mapper パターン + CQRS で、テーブルを変えずに読み書きモデルを分離した。