Change Data Capture
データベースの変更をリアルタイムに検出し、下流システムに伝播させるデータ統合パターン
データベースイベント駆動
Change Data Capture とは
Change Data Capture (CDC) は、データベースの INSERT、UPDATE、DELETE をリアルタイムに検出し、変更イベントとして下流のシステム (検索エンジン、キャッシュ、分析基盤) に伝播させるデータ統合パターンである。アプリケーションコードを変更せずに、データベースの変更を複数のシステムに配信できる。
CDC の実装方式
| 方式 | 仕組み | 遅延 | DB 負荷 | 信頼性 |
|---|---|---|---|---|
| ログベース | トランザクションログを読み取り | ミリ秒〜秒 | 低い | 高い |
| トリガーベース | DB トリガーで変更を検出 | ミリ秒 | 高い | 高い |
| ポーリング | 定期的にテーブルをスキャン | 秒〜分 | 中程度 | 中程度 |
| タイムスタンプ | updated_at で変更を検出 | 秒〜分 | 中程度 | DELETE を検出不可 |
ログベースが最も効率的で、本番環境で推奨される。DB のトランザクションログ (MySQL の binlog、PostgreSQL の WAL) を読み取るため、アプリケーションへの影響が最小限だ。
AWS での CDC
DynamoDB Streams
DynamoDB のネイティブ CDC。アイテムの変更を 24 時間保持し、Lambda で処理する。
RDS + Debezium
MySQL/PostgreSQL のバイナリログを Debezium (オープンソースの CDC ツール) で読み取り、Kafka や Kinesis に転送する。MSK (Managed Streaming for Apache Kafka) と組み合わせて使う。
活用パターン
[DynamoDB] → [Streams] → [Lambda] → [OpenSearch] (検索インデックス更新)
→ [ElastiCache] (キャッシュ更新)
→ [S3] (分析用データレイク)
→ [SQS] (他サービスへの通知)
- CQRS の読み取りモデル更新
- 検索インデックスの同期
- キャッシュの自動更新
- データレイクへのリアルタイム連携
- マイクロサービス間のデータ同期
Transactional Outbox との違い
| パターン | 仕組み | 用途 |
|---|---|---|
| CDC | DB のログを直接読み取り | 汎用的なデータ同期 |
| Transactional Outbox | Outbox テーブルに書き込み → ポーリング | イベント発行の信頼性保証 |
CDC はアプリケーションコードの変更が不要だが、DB のログ形式に依存する。Outbox パターンはアプリケーションが明示的にイベントを書き込むため、イベントの内容を制御しやすい。
Change Data Capture の理解を深めるには関連書籍が参考になる。