Change Data Capture
データベースの変更をリアルタイムに検出し、下流システムに伝播させるデータ統合パターン
Change Data Capture とは
Change Data Capture (CDC) は、データベースの INSERT、UPDATE、DELETE をリアルタイムに検出し、変更イベントとして下流のシステム (検索エンジン、キャッシュ、分析基盤) に伝播させるデータ統合パターンである。アプリケーションコードを変更せずに、データベースの変更を複数のシステムに配信できる。
CDC の実装方式
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] (他サービスへの通知)
Transactional Outbox との違い
Transactional Outbox との違いを以下にまとめる。
| パターン | 仕組み | 用途 |
|---|---|---|
| CDC | DB のログを直接読み取り | 汎用的なデータ同期 |
| Transactional Outbox | Outbox テーブルに書き込み → ポーリング | イベント発行の信頼性保証 |
CDC はアプリケーションコードの変更が不要だが、DB のログ形式に依存する。Outbox パターンはアプリケーションが明示的にイベントを書き込むため、イベントの内容を制御しやすい。
Change Data Capture の理解を深めるには関連書籍が参考になる。
この記事は役に立ちましたか?
関連用語
DynamoDB Streams
DynamoDB テーブルの変更をリアルタイムでキャプチャし、Lambda で処理するイベントソース
イベント駆動アーキテクチャ
イベントの発行と購読を中心にシステムを構成し、サービス間の疎結合と非同期処理を実現するアーキテクチャスタイル
トランザクショナルアウトボックス
データベースへの書き込みとイベント発行を原子的に行うための分散システムパターン
CQRS
データの読み取り (Query) と書き込み (Command) を別々のモデルで処理し、それぞれを独立して最適化するアーキテクチャパターン
リードレプリカ
プライマリ DB の読み取り専用コピーで、読み取り負荷を分散しスケーラビリティを向上させる
Outbox パターン
DB の変更とイベント発行を 1 つのトランザクションで保証するメッセージング信頼性パターン