イベント駆動アーキテクチャ
システムの状態変化を「イベント」として捉え、それを中心にアーキテクチャを構築するパターンを学びます。
なぜ学ぶのか
┌─────────────────────────────────────────────────────────────┐
│ よくある成長の壁 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 最初: │
│ ┌─────────┐ │
│ │ App │ → PostgreSQL(読み書き全部ここ) │
│ └─────────┘ │
│ → シンプル、十分速い │
│ │
│ 成長すると: │
│ ┌─────────┐ │
│ │ App │ → PostgreSQL │
│ └─────────┘ ├── 認証処理(OLTP) │
│ ├── 統計集計(OLAP)← 遅い!ロック競合! │
│ ├── 監査ログ検索 ← 遅い! │
│ └── 通知送信 ← トランザクション内でI/O! │
│ │
│ → 1つのDBに責務が集中して限界に │
│ │
│ イベント駆動で解決: │
│ ┌─────────┐ イベント │
│ │ App │ → 「ログインした」→ PostgreSQL(認証データ) │
│ └─────────┘ │ │
│ ├──→ ClickHouse(統計・分析) │
│ ├──→ Elasticsearch(監査ログ検索) │
│ └──→ メール/Slack(通知) │
│ │
│ → 各システムが得意なことに専念 │
│ │
└─────────────────────────────────────────────────────────────┘
このセクションで学ぶ3つの概念
┌─────────────────────────────────────────────────────────────┐
│ │
│ ドメインイベント │
│ 「何が起きたか」を表す │
│ ├── LoginSucceeded, TokenIssued, PasswordChanged │
│ └── ビジネス上の出来事をオブジェクトとして表現 │
│ │ │
│ │ これを記録し続けると... │
│ ▼ │
│ イベントソーシング │
│ 「起きたことの履歴」がデータの本体 │
│ ├── 現在の状態はイベントの再生で導出する │
│ └── 監査証跡が自然に残る、時間を遡れる │
│ │ │
│ │ 書き込みと読み取りで最適な形が違うなら... │
│ ▼ │
│ CQRS │
│ 「書く側」と「読む側」を分離する │
│ ├── Command: イベントを書く(PostgreSQL) │
│ └── Query: 集計を読む(ClickHouse 等) │
│ │
└─────────────────────────────────────────────────────────────┘
これらは DDD(ドメイン駆動設計)の文脈で語られることが多いですが、本質はアーキテクチャパターンです。DDD を採用していなくても、大量データの処理やシステム間連携で広く適用されています。
学習の流れ
┌─────────────────────────────────────────────────────────────┐
│ 学習ロードマップ │
├─────────────────────────────────────────────────────────────┤
│ │
│ 概念 │
│ ├── ドメインイベント │
│ │ └── 何が起きたかを表すオブジェクト │
│ ├── イベントソーシング │
│ │ └── イベントの履歴がデータの本体 │
│ └── CQRS │
│ └── 書き込みと読み取りの分離 │
│ │
│ 実現パターン │
│ ├── イベント伝搬の方法 │
│ │ └── CDC, メッセージキュー, アプリ内Pub/Sub │
│ ├── イベントストアの選択 │
│ │ └── RDB, Kafka, EventStoreDB │
│ └── 読み取りモデルの構築 │
│ └── ClickHouse, Elasticsearch, マテビュー │
│ │
└─────────────────────────────────────────────────────────────┘
ドキュメント一覧
概念
| # | ドキュメント | 説明 |
|---|---|---|
| 01 | ドメインイベント | 「何が起きたか」をオブジェクトとして表現する |
| 02 | イベントソーシング | イベントの履歴をデータの本体とするパターン |
| 03 | CQRS | 書き込みと読み取りを分離するアーキテクチャ |
実現パターン
| # | ドキュメント | 説明 |
|---|---|---|
| 04 | 実現パターン | CDC, メッセージキュー, イベントストアの選択 |
| 05 | スケーリングパターン | 高速・大量トランザクション時のボトルネックと対策 |
| 06 | AWS での構築 | Small / Medium / Large の3段階構成 |