CTS-KB

イベントソーシング

いべんとそーしんぐ

Event Sourcing ES
#設計パターン #DDD #アーキテクチャ

状態そのものではなく「状態を変化させたイベントの列」を真実として永続化し、現在の状態は再生で復元する設計パターン。Greg Young らが DDD コミュニティで広めた。

概要

通常の DB は「現在の在庫数: 12」を保存する。イベントソーシングは「入荷+10」「出荷-3」「入荷+5」というイベント列を保存し、必要なときに畳み込んで「12」を導出する。 過去の事実を上書きせず追記のみ で扱うのが核心。

通常の永続化との違い

観点状態保存(CRUD)イベントソーシング
保存する真実現在の状態状態変化のイベント列
過去の参照別途監査ログが必要イベント列がそのまま履歴
状態の再構築不要イベントを畳み込む
書き込みモデルUPDATE 中心APPEND-ONLY
「もし◯◯だったら」の分析困難イベントを再生して試算可能

代表的な利点

  • 完全な監査証跡 — いつ・誰が・何をしたかを欠落なく追える
  • 時間軸での再現 — 任意の過去時点の状態を復元できる
  • 因果関係の可視化 — ドメインで起きた出来事をそのまま残せる
  • 読み取りモデルの自由設計 — 同じイベントから複数の Read Model を生成できる

注意点

リスク対策
イベントスキーマの変更バージョン付与・アップキャスト戦略を最初から設計
再生コスト増大スナップショットを定期的に保存
学習コスト既存 CRUD 文化との認識ギャップが大きい
削除要求(GDPR 等)暗号化キー破棄など crypto-shredding で対応

イベント DB(Event Store)の選び方

イベントソーシングを実装する際に、イベント列を格納するストレージを Event Store(イベント DB) と呼ぶ。専用 DB を使うか、汎用 DB の上に構築するかで選択肢が分かれる。

分類代表例特徴
専用 Event StoreEventStoreDB(現 Kurrent)ストリーム・サブスクリプション・Projection を一級機能として提供
RDBMS 上のライブラリMarten(PostgreSQL / .NET)・Axon Server(Java)・Eventuate既存の PostgreSQL / SQL 資産を活かせる。運用の学習コスト低
ドキュメント DBMongoDB + 自作追記テーブル柔軟だが、Projection / 楽観ロック等は自力で作り込む必要がある
メッセージングログApache Kafka・Apache Pulsarログ無期限保持で Event Store として使える。分散前提の大規模系
クラウドマネージドAWS DynamoDB + Streams + Kinesis / Azure Cosmos DB(Change Feed)マネージドでスケールアウト容易。ベンダーロックインに注意

選定観点

観点チェックポイント
書き込み原子性1 集約 = 1 ストリームで楽観ロックが効くか
読み取り(再生)性能長いストリームでスナップショットや Projection を作れるか
スキーマ進化アップキャスト・バージョン付与のサポート
Subscription / Projectionイベントを購読して Read Model を自動更新できるか
マルチテナントテナントごとにストリーム・パーティションを分けられるか
既存運用との親和性RDBMS 運用の知見をそのまま使えるか
言語・ランタイム.NET / Java / Node.js での実装サポート

よくある誤選定

  • 「Event Store = Kafka」と短絡 — Kafka はメッセージングのログで、細粒度の楽観ロックや任意ストリーム再生には向かない。集約 1 件を再生するのに全体を走査する設計になりがち
  • 「RDBMS で自作する」 — 単純な append は簡単だが、スナップショット・Projection・並行制御・再生ツールなど運用周りで疲弊する。ライブラリ採用を先に検討
  • 「イベント DB を唯一の SSoT にする」 — Read Model を作らず直接イベントから UI を組み立てると、画面表示のために巨大ストリームを毎回再生して破綻する

CQRS との組み合わせ

CQRSの書き込み側でイベントソーシングを採用するのが定番。書き込みはイベント追記で原子性を保ち、読み取りはイベントを購読した Read Model から行う。EC のように「在庫変動」「注文確定」「キャンセル」など出来事の追跡が業務価値に直結する領域と相性が良い。

EC ドメインでの適用イメージ

CTS-EC 共通商品マスタのように マルチモール在庫・出品状態の同期 が業務の中心になるドメインでは、状態スナップショットだけでは「いつ・なぜ在庫差分が出たのか」「どの操作でモール反映が崩れたのか」を後追いしにくい。出来事を追記して残し、必要に応じて再生する設計は監査性とトラブル復旧の両面で効きやすい。

関連記事

関連用語

  • DDD — ドメインイベントの発想を共有する設計手法
  • 集約 — イベントを発行する単位
  • CQRS — イベントソーシングと併用される代表的なパターン
  • Saga パターン — 複数集約のイベントを調停する仕組み
  • CES アプローチ — CQRS + Event Sourcing + Saga の統合スタイル
  • SSoT — イベントログを唯一の真実とする整理