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 で、テーブルを変えずに読み書きモデルを分離した。

関連