イベントソーシングとは
はじめに
ソフトウェア開発において、データの管理方法はシステムの設計や拡張性に大きく影響します。イベントソーシングは、データの状態変化を時間軸に沿って記録することで、システムの柔軟性と透明性を高めるアプローチです。本記事では、イベントソーシングの本質を捉え、その基本的な考え方と具体的な例を通じて理解を深めます。
イベントソーシングとは何か
イベントソーシングは、システム内で発生するすべての状態変化をイベントとして記録し、そのイベントの履歴から現在の状態を再構築するデータモデルです。従来のCRUD(作成、読み取り、更新、削除)操作では、最新の状態のみがデータベースに保存され、過去の状態は上書きされてしまいます。一方、イベントソーシングでは、状態変化の**履歴(時間軸)**をすべて保持します。
なぜ時間軸が重要なのか
時間軸を取り入れることで、以下のようなメリットがあります。
- 過去の状態の再現:任意の時点でのデータの状態を再現できます。
- 監査とトレーサビリティ:誰が、いつ、どのような操作を行ったかを正確に追跡できます。
- ビジネスインサイトの獲得:ユーザーの行動パターンやトレンド分析に活用できます。
具体例で理解するイベントソーシング
銀行口座の例
銀行口座の残高管理を例に考えてみましょう。
従来のデータモデル
従来のデータモデルでは、口座のテーブルに現在の残高のみが保存されます。
口座ID | 残高 |
---|---|
12345 | ¥50,000 |
このモデルでは、過去の入出金履歴は別途トランザクションテーブルを参照する必要があります。また、過去の残高を再現するのは困難です。
イベントソーシングのデータモデル
イベントソーシングでは、口座に対するすべての取引をイベントとして記録します。
イベントのリスト
- 口座開設(初期残高 ¥0)
- ¥100,000 の入金
- ¥30,000 の出金
- ¥20,000 の出金
これらのイベントを時系列で保存します。
イベントID | タイムスタンプ | イベント種別 | 金額 |
---|---|---|---|
1 | 2023-01-01 09:00 | 口座開設 | ¥0 |
2 | 2023-01-05 10:15 | 入金 | ¥100,000 |
3 | 2023-01-10 14:30 | 出金 | ¥30,000 |
4 | 2023-01-15 16:45 | 出金 | ¥20,000 |
現在の残高を再構築する
イベントを順番に適用していくことで、現在の残高を計算できます。
- 残高:¥0
- 残高:¥0 + ¥100,000 = ¥100,000
- 残高:¥100,000 - ¥30,000 = ¥70,000
- 残高:¥70,000 - ¥20,000 = ¥50,000
過去の状態を再現する
例えば、2023-01-12 時点での残高を知りたい場合、タイムスタンプがその日時以前のイベントのみを適用します。
- イベント1、2、3を適用
- 残高:¥70,000
ショッピングカートの例
オンラインショッピングカートの状態管理もイベントソーシングで効果的に行えます。
イベントのリスト
- 商品Aをカートに追加
- 商品Bをカートに追加
- 商品Aをカートから削除
- 商品Cをカートに追加
カートの状態を再構築する
イベントを順番に適用します。
- カート:商品A
- カート:商品A、商品B
- カート:商品B
- カート:商品B、商品C
商品購入レポートの生成
イベントソーシングでは、イベントの履歴を元にプロジェクションを作成し、特定の要件に応じたデータを集計したりフィルタリングできます。
例えば、オンラインショップでの購入履歴レポートを作成する場合、各購入イベントを集計して、商品ごとの売上合計や顧客ごとの購入数を計算することが可能です。
購入イベントのリスト
商品Aが購入されました(¥10,000)
商品Bが購入されました(¥5,000)
商品Aが再度購入されました(¥10,000)
プロジェクションの作成
商品ごとの売上合計:
商品A:¥20,000
商品B:¥5,000
商品ごとの購入回数:
商品A:2回
商品B:1回
このように、イベントソーシングの履歴を使って、必要に応じたレポートやデータ集計が可能です。プロジェクションはその都度計算されるため、集計結果が変更されたり、後から新しい指標が追加されても、柔軟に対応できます。
イベントソーシングの本質
イベントソーシングの本質は、「状態をイベントの履歴として捉える」ことにあります。データの現在の状態は、過去のイベントの累積結果であり、その履歴を保持することで、システムの透明性と柔軟性が向上します。
主な特徴
- 不変性:イベントは発生した事実として不変であり、後から変更されません。
- 再現性:イベントのシーケンスを再生することで、任意の時点の状態を再現できます。
- 拡張性:新たなビジネス要件や機能追加に対して柔軟に対応できます。
イベントソーシングのデメリット
- 実装の複雑性:イベントの設計や管理が必要で、実装が複雑になる。
- データ量の増加:すべてのイベントを保存するため、データストレージが増加。
- 学習コスト:開発者がイベントソーシングの概念を理解する必要がある。
まとめ
イベントソーシングは、時間軸を取り入れたデータモデルであり、システム内の状態変化をすべてイベントとして記録します。これにより、過去の状態を再現でき、ビジネス要件の変更にも柔軟に対応できます。
Discussion