イベントソーシング
状態の変更をイベントとして記録し、イベントの再生で現在の状態を復元する設計パターン
イベントソーシングとは
イベントソーシングは、状態の変更をイベントとして記録し、イベントの再生 (リプレイ) で現在の状態を復元する設計パターンである。CRUD の「更新」ではなく「追記」でデータを管理する。
CRUD vs イベントソーシング
CRUD と イベントソーシング の違いを図で示す。
CRUD:
UPDATE accounts SET balance = 900 WHERE id = 'A';
→ 以前の値 (1000) は失われる
イベントソーシング:
Event 1: AccountCreated { id: 'A', balance: 1000 }
Event 2: MoneyWithdrawn { id: 'A', amount: 100 }
→ 現在の状態: balance = 1000 - 100 = 900
→ 全履歴が残る
DynamoDB でのイベントストア
DynamoDB でのイベントストアのコード例を示す。
// イベントの書き込み
await db.put({
TableName: 'events',
Item: {
entityId: 'order-123',
timestamp: Date.now(),
eventType: 'OrderCreated',
data: { items: ['item-1'], total: 1000 },
version: 1,
},
});
// 状態の復元 (イベントのリプレイ)
const events = await db.query({
TableName: 'events',
KeyConditionExpression: 'entityId = :id',
ExpressionAttributeValues: { ':id': 'order-123' },
ScanIndexForward: true, // 時系列順
});
const state = events.Items.reduce((order, event) => {
switch (event.eventType) {
case 'OrderCreated': return { ...event.data, status: 'created' };
case 'OrderPaid': return { ...order, status: 'paid' };
case 'OrderShipped': return { ...order, status: 'shipped' };
default: return order;
}
}, {});
メリット
全変更履歴がイベントとして残るため、完全な監査証跡が得られる。任意の時点の状態を復元する「時間旅行」が可能で、デバッグ時に問題の再現が容易になる。イベントが発生するたびに下流システムへ自然に通知できるため、イベント駆動アーキテクチャとの親和性が高い。
デメリット
メリットとデメリットを以下にまとめる。
| デメリット | 対策 |
|---|---|
| クエリが複雑 | CQRS で読み取り用ビューを分離 |
| イベント数の増加 | スナップショットで高速化 |
| スキーマの進化 | イベントのバージョニング |
CQRS との組み合わせ
CQRS との 組み合わせを図で示す。
書き込み: イベントストア (DynamoDB)
↓ DynamoDB Streams
読み取り: マテリアライズドビュー (別テーブル or OpenSearch)
ユースケース
代表的なユースケースを以下にまとめる。
| ユースケース | 理由 |
|---|---|
| 金融取引 | 監査証跡が必須 |
| 注文管理 | 状態遷移の履歴が重要 |
| ゲーム | リプレイ機能 |
| コラボレーション | 変更の競合解決 |
全体像を把握するには関連書籍も有用。
この記事は役に立ちましたか?
関連用語
Change Data Capture
データベースの変更をリアルタイムに検出し、下流システムに伝播させるデータ統合パターン
DynamoDB Streams
DynamoDB テーブルの変更をリアルタイムでキャプチャし、Lambda で処理するイベントソース
CQRS
データの読み取り (Query) と書き込み (Command) を別々のモデルで処理し、それぞれを独立して最適化するアーキテクチャパターン
イベント駆動アーキテクチャ
イベントの発行と購読を中心にシステムを構成し、サービス間の疎結合と非同期処理を実現するアーキテクチャスタイル
EventBridge
AWS のサーバーレスイベントバスで、イベント駆動アーキテクチャの中核を担う
イベントストーミング
ドメインエキスパートと開発者が協働でビジネスプロセスを可視化するワークショップ手法
関連する記事
技術書の読む順番戦略 - 複数冊を組み合わせて理解を加速させる
技術書を 1 冊ずつ読むのではなく、複数冊を戦略的に組み合わせることで理解の深さと速度を飛躍的に高める方法を解説します。
技術書の読書ログを GitHub で管理する - エンジニアらしい記録法
技術書の読書記録を GitHub リポジトリで管理する方法を紹介します。Markdown で読書ノートを書き、コミット履歴で読書の軌跡を残す、エンジニアならではの読書ログ術です。
ゲームが好きならプログラミングの本も読める
ゲームの攻略本を読んだことがあるなら、プログラミングの本も読めます。攻略本とプログラミング本の共通点から、読書のハードルを下げます。