ストーリー
田
田中VPoE
ストリーム処理、イベント駆動、CDC、リアルタイム分析。一通り学んだところで実践だ。DataFlow社にリアルタイムデータパイプラインを設計してもらう
あなた
DataFlow社はマーケティングオートメーションSaaSでしたね。どんなリアルタイム要件がありますか?
あ
田
田中VPoE
3つある。第一に、メール配信のリアルタイムモニタリング — 大量配信中にバウンス率が急上昇したら即座に配信を停止する必要がある。第二に、ユーザー行動のリアルタイムトラッキング — 「今この瞬間にサイトを見ているユーザー」を可視化する。第三に、CDCによるDWHのニアリアルタイム更新だ
あなた
レイテンシ要件がそれぞれ異なりますね。適切なアーキテクチャを選定します
あ
田
田中VPoE
そうだ。「すべてをリアルタイムにする」のではなく、要件に応じたアーキテクチャを設計してくれ
ミッション概要
| 項目 | 内容 |
|---|
| 演習タイトル | ストリーム処理パイプラインの設計 |
| 想定時間 | 90分 |
| 成果物 | リアルタイムパイプライン設計書(3つのユースケース) |
前提条件
DataFlow社のリアルタイム要件:
1. メール配信モニタリング(レイテンシ: 秒)
- 1日あたり約500万通のメール配信
- バウンス率、開封率、クリック率をリアルタイムに集計
- バウンス率が5%を超えたら自動アラート+配信停止
2. ユーザー行動トラッキング(レイテンシ: 分)
- ピーク時の同時接続: 約10,000ユーザー
- ページビュー、クリック、フォーム送信をトラッキング
- 「現在アクティブなユーザー数」をダッシュボードに表示
3. DWHニアリアルタイム更新(レイテンシ: 5分以内)
- PostgreSQLの主要テーブル(users, subscriptions, campaigns)の変更をBigQueryに同期
- 日次バッチの代替として、ニアリアルタイムのデータ鮮度を実現
技術スタック:
- 既存: PostgreSQL, MongoDB, BigQuery, Looker
- 利用可能: AWS (Kafka/MSK, Kinesis), GCP (Pub/Sub, Dataflow)
Mission 1: メール配信モニタリングの設計
要件
バウンス率のリアルタイム監視と自動停止の仕組みを設計してください。
- イベントスキーマを定義する
- ストリーム処理のアーキテクチャを設計する
- ウィンドウ集計とアラート条件を定義する
- 障害時のフォールバックを設計する
解答例
イベントスキーマ
{
"event_id": "evt_email_001",
"event_type": "email.delivered | email.bounced | email.opened | email.clicked",
"timestamp": "2025-06-15T14:30:00Z",
"data": {
"campaign_id": "camp_123",
"recipient_email_hash": "sha256_abc",
"message_id": "msg_456",
"bounce_type": "hard | soft",
"bounce_reason": "invalid_address"
}
}
アーキテクチャ
メール配信サーバー → Kafka Topic: email-events
→ Flink (5分タンブリングウィンドウ)
→ campaign_idごとにバウンス率を計算
→ バウンス率 > 5% → アラート + 配信停止API呼び出し
→ 集計結果 → ClickHouse → Grafanaダッシュボード
ウィンドウ集計
| メトリクス | ウィンドウ | 集計 | アラート条件 |
|---|
| バウンス率 | 5分タンブリング | bounced / (delivered + bounced) | > 5% |
| 開封率 | 1時間スライディング(5分スライド) | opened / delivered | 参考値 |
| 配信速度 | 1分タンブリング | delivered件数 / 分 | < 期待値の50% |
Mission 2: ユーザー行動トラッキングの設計
要件
ユーザー行動をリアルタイムに集計し、ダッシュボードに表示する仕組みを設計してください。
- イベント収集のアーキテクチャを設計する
- セッションウィンドウの定義を決定する
- リアルタイムダッシュボードの更新方式を選択する
解答例
アーキテクチャ
ブラウザ(JS SDK)→ イベント収集API → Kafka Topic: user-events
→ Flink (セッションウィンドウ: ギャップ30分)
→ セッション単位の集計
→ ClickHouse / BigQuery Streaming Insert
→ Lookerダッシュボード (30秒ごとにリフレッシュ)
セッションウィンドウ定義
| 項目 | 設定値 |
|---|
| セッションギャップ | 30分 |
| セッション最大長 | 24時間 |
| ウォーターマーク遅延 | 2分 |
リアルタイムメトリクス
| メトリクス | 計算方法 |
|---|
| 現在のアクティブユーザー数 | 過去5分間にイベントを発生させたユニークユーザー数 |
| 現在のページビュー/分 | 1分タンブリングウィンドウでのPVカウント |
| 平均セッション時間 | セッションウィンドウの開始〜終了の平均 |
Mission 3: CDCによるDWHニアリアルタイム更新
要件
PostgreSQLからBigQueryへのCDCパイプラインを設計してください。
- CDC方式とツールを選定する
- データフローを設計する(初期ロード + 増分同期)
- Bronze層への取り込みとSilver層への変換を設計する
- データ整合性の検証方法を定義する
解答例
ツール選定
| コンポーネント | ツール | 理由 |
|---|
| CDC | Debezium (Kafka Connect) | OSSで実績豊富、PostgreSQL WAL読み取り |
| メッセージング | Amazon MSK (Managed Kafka) | マネージドでKafka互換 |
| Sink | BigQuery Kafka Connector | Kafka → BigQuery直接書き込み |
データフロー
Phase 1: 初期ロード
PostgreSQL → Debezium Snapshot → Kafka → S3 (Bronze)
→ dbt (Silver/Gold) → BigQuery
Phase 2: 増分同期
PostgreSQL WAL → Debezium → Kafka → BigQuery Sink Connector
→ Bronze テーブル (Streaming Insert)
→ dbt (5分ごとにincremental run) → Silver/Gold テーブル
整合性検証
| チェック | 方法 | 頻度 |
|---|
| レコード数 | PostgreSQL COUNT() vs BigQuery COUNT() | 1時間ごと |
| チェックサム | 主要カラムのハッシュ値比較 | 日次 |
| 遅延監視 | Debeziumのラグモニタリング | リアルタイム |
達成度チェック
| 観点 | 達成基準 |
|---|
| メール監視 | ウィンドウ集計とアラート条件が定義されている |
| ユーザートラッキング | セッションウィンドウとリアルタイムメトリクスが設計されている |
| CDC | 初期ロード+増分同期のフローと整合性検証が設計されている |
| レイテンシ選定 | 各ユースケースに適切なレイテンシとアーキテクチャが選択されている |
推定所要時間: 90分