CQRS
#アーキテクチャ #プログラミングの技法
Command Query Responsibility Segregation
コマンドクエリ責務分離
オブジェクト指向の文脈と、 #アーキテクチャ の文脈があることに注意
Write を Command 、 Read を Query として分離するというもの
オブジェクト指向
コマンド・クエリという考え方 - Qiita
アーキテクチャへの言及もあり
アーキテクチャ
CQRS パターン - Azure Architecture Center | Microsoft Docs
従来の問題
Read/Writeを同じモデルで行うと、複雑になりすぎる恐れがある
様々な Read の要求に対応するためにマッピングが複雑になるらしい
読み込みと書き込みの負荷が不均衡なときにパフォーマンスチューニングやスケールがしづらい
解決策
https://docs.microsoft.com/ja-jp/azure/architecture/patterns/_images/command-and-query-responsibility-segregation-cqrs-basic.png
読み込みDBと書き込みDBを分離してもいい
データ同期と整合性の維持が少し大変そう
読み込み専用レプリカならよさそう、Amazon Aurora 的な
利点
独立したスケーリング
最適化されたデータスキーマ
セキュリティ
懸念事項の分離
クエリがよりシンプル
実装上の問題
複雑さ
メッセージング
最終的な一貫性
このパターンを使用する状況
多くのユーザが同じデータに並行してアクセスするとき
読み書きのリクエストが不均衡なとき
CQRSパターンとイベントソーシングパターン
ここでは読み込みと書き込みで DB が分離されている前提
イベントを永続化して、 matelialized view として読み込む
実装の複雑度は増す
集計をするイベントが多すぎるときにはデータのスナップショットを実装するといいらしい
CQRS実践入門 ドメイン駆動設計 - little hands' lab