Skip to content

CQRSアーキテクチャ(申告データ向け)

申告データに対しては、CQRS (Command Query Responsibility Segregation) パターンを採用し、「書き込み(Command)」と「読み取り(Query)」の責務を分離します。

採用理由

目的CQRSによる実現
履歴管理全ての変更操作をコマンドとして記録し、任意時点への復元を可能にする
監査証跡「誰が」「いつ」「何を」変更したかを完全に追跡可能
データ分離従業員入力データと管理者入力データを明確に分離して管理
読み取りパフォーマンス表示用のデータモデル(Read Model)を最適化し、高速なクエリを実現

アーキテクチャ構成図(スナップショット方式)

Command SideQuery SideCommand(作成/更新/削除)保存同期更新(即時整合性)保存Query(読み取り)読み取りBFF / API クライアントPostgreSQLCommand HandlerWrite Model(JSONB スナップショット)DeclarationSnapshot操作者・日時を記録Query HandlerRead Model(表示用最新データ)
Command SideQuery SideCommand(作成/更新/削除)保存同期更新(即時整合性)保存Query(読み取り)読み取りBFF / API クライアントPostgreSQLCommand HandlerWrite Model(JSONB スナップショット)DeclarationSnapshot操作者・日時を記録Query HandlerRead Model(表示用最新データ)

IMPORTANT

本システムは完全なイベントソーシングは採用せず、スナップショット方式を採用する(下記「イベントソーシングの採用判断」参照)。上図の Write Model はイベントストアではなく、画面遷移ごとのスナップショットを JSONB として保存する。

Command Side

  • 申告データの作成・更新・削除はすべてコマンドとして処理
  • 各コマンド実行時に、申告データ全体のスナップショットをJSONBとして保存
  • スナップショットには操作者(従業員/管理者)と日時を記録

Query Side

  • 表示用の最新データは Read Model として別途管理
  • コマンド実行後に Read Model を同期的に更新(結果整合性ではなく即時整合性を優先)

イベントソーシングの採用判断

観点イベントソーシングありスナップショット方式(採用)
履歴の粒度全操作を完全に記録画面遷移時のスナップショットのみ
復元の柔軟性任意の操作単位で復元可能スナップショット単位での復元
実装の複雑さ高(イベントスキーマの進化管理が必要)中(スナップショットの管理のみ)
ストレージ量多い(全イベントを保持)少ない(スナップショットのみ)

採用方針: スナップショット方式を採用する。年末調整の業務特性(年度単位のライフサイクル、変更頻度が低い、監査証跡はスナップショット粒度で十分)に対して、イベントソーシングの複雑さ(イベントスキーマの進化管理、Read Modelの再構築等)は正当化できない。