Cloud Service
Pub/Sub + Dataflow
Pub/Sub でストリーミングデータを取り込み、Dataflow(Apache Beam)でリアルタイム/バッチ処理する GCP のストリーミング基盤。AWS の Kinesis に相当。
- 1.流れ続けるデータを Pub/Sub で受け、Dataflow で変換・集計。
- 2.シャード管理不要で自動スケール、バッチも同じコードで処理。
- 3.AWS の Kinesis 相当。BigQuery 直送なら自前処理は不要。
解決する課題
- 大量データをリアルタイムに取り込み、プロデューサとコンシューマを疎結合にしたい
- ストリーム(無制限データ)とバッチ(有制限データ)を同じコードで処理したい
- 流量の変動に合わせてワーカーを自動でスケールさせ、サーバー管理から解放されたい
- 集計結果を BigQuery / Cloud Storage / Bigtable へ自動ロードしたい
主要概念と用語
- Pub/Sub トピック / サブスクリプション: パブリッシャがメッセージを送る宛先がトピック、コンシューマが受け取る口がサブスクリプション。1 トピックに複数サブスクリプションを付ければファンアウトでき、各コンシューマが独立に受信する
- Pull / Push サブスクリプション: コンシューマ側が取りに行く Pull と、Pub/Sub が HTTPS で押し込む Push。低レイテンシ・大量処理は通常 Pull(StreamingPull)
- Apache Beam: Dataflow が実行する統合プログラミングモデル。
PCollection(データ集合)にPTransform(変換)を適用してパイプラインを記述する。同じコードがバッチでもストリーミングでも動く - ランナー (Runner): Beam パイプラインの実行基盤。Dataflow ランナーを使うと GCP のマネージド環境で実行される(他に Flink / Spark ランナーもある)
- ウィンドウ / ウォーターマーク / トリガー: ストリームを時間で区切るウィンドウ(固定・スライディング・セッション)、データの進捗を表すウォーターマーク、結果を出すタイミングを決めるトリガー。遅延データの扱いを制御する
- イベント時刻 (event time) と処理時刻 (processing time): データが発生した時刻と、Dataflow が処理した時刻。正確な集計はイベント時刻を基準にする
仕様・制限・クォータ
- Pub/Sub はサーバーレスでシャード管理が不要。スループットは自動拡張し、メッセージは最大 10 MB。未確認(ack)メッセージの保持は既定 7 日(最大 7 日、トピック保持は最大 31 日)
- Pub/Sub は At-least-once(最低 1 回)配信が既定。順序は順序指定キーを付けた場合のみ保証される。リージョン内でExactly-once 配信を有効化することも可能
- Dataflow はジョブ単位で動き、ワーカー(Compute Engine VM)を水平オートスケール。Streaming Engine / Dataflow Prime を使うとシャッフルや状態をサービス側にオフロードできる
- バッチは有制限データ、ストリーミングは無制限データを処理。Flexible Resource Scheduling (FlexRS) でバッチをスポット VM 中心に安く実行できる
内部の仕組み
Pub/Sub はグローバルなメッセージバスで、パブリッシュされたメッセージをサブスクリプションごとに独立したキューとして保持します。コンシューマが ack するまで再配信されるため、処理が失敗しても消えません。シャード(パーティション)という概念がなく、流量に応じて内部で自動的にスケールします。
Dataflow は Beam パイプラインを受け取り、各 PTransform をワーカー VM 群に分散実行します。ストリーミングではウォーターマークでデータの進捗を追跡し、ウィンドウごとに集計を確定。Streaming Engine は状態管理とシャッフルをワーカーから切り離し、オートスケールとリソース効率を高めます。
Pub/Sub=多対多のストリーミング配信(ファンアウト・高スループット)、Cloud Tasks=個別タスクのディスパッチ(実行時刻やレート制御を細かく管理)。「ストリームを並列処理」なら Pub/Sub、「特定の処理を確実に 1 回キックする」なら Cloud Tasks を選ぶ。
設計パターン / ベストプラクティス
- 取り込み = Pub/Sub、処理 = Dataflow、保存先 = BigQuery / GCS / Bigtable の三段構成が王道
- 単純な「ストリームを BigQuery へ流すだけ」なら、自前パイプラインを書かず Dataflow テンプレート(Pub/Sub Subscription to BigQuery など)や Pub/Sub の BigQuery サブスクリプションを使うと最小運用
- 集計はイベント時刻ベースのウィンドウで行い、遅延データは許容遅延 (allowed lateness) とトリガーで制御
- 重複に備え、ダウンストリームを冪等に設計する(At-least-once が既定のため)。厳密性が必要なら Exactly-once 配信や Dataflow の重複排除を併用
- 失敗メッセージはデッドレタートピック (dead-letter topic) へ退避し、本流を止めない
運用・監視
- Cloud Monitoring でメトリクスを監視。Pub/Sub は
subscription/num_undelivered_messages(未処理バックログ)とsubscription/oldest_unacked_message_age(最古の未 ack 経過時間 = 遅延の指標)が重要 - Dataflow は システムラグ (System Lag) と データ鮮度 (Data Freshness) でストリーミングの遅延を検知。バックログが増え続けるならワーカー不足やホットキーを疑う
- Dataflow ジョブグラフ / 実行詳細 で各ステージのスループットとボトルネックを可視化
- バックログ増大時はオートスケールの上限(
maxNumWorkers)やキー分散を見直す
コスト
| サービス / オプション | 課金の考え方 | 向いている用途 |
|---|---|---|
| Pub/Sub | メッセージのスループット量(パブリッシュ/配信/保持の GiB) | 取り込み・ファンアウト全般 |
| Dataflow(ストリーミング) | ワーカーの vCPU・メモリ・ストレージ時間+Streaming Engine 処理量 | 常時稼働のリアルタイム処理 |
| Dataflow(バッチ) | ジョブ実行中のワーカー時間(FlexRS でスポット中心に割引) | 定期/大規模バッチ |
| BigQuery サブスクリプション | Pub/Sub の取り込み量のみ(Dataflow 不要) | 変換が不要で BigQuery へ直送するだけ |
セキュリティ
- サービスアカウントで Pub/Sub・Dataflow の権限を付与し、認証情報のハードコードを避ける(AWS の IAM ロール相当)。Dataflow ワーカーには専用のワーカーサービスアカウントを割り当てる
- IAM でパブリッシャ / サブスクライバ / ジョブ実行を最小権限に分離。
roles/pubsub.publisherとroles/pubsub.subscriberを分ける - 保存データは Google 管理鍵で既定暗号化。要件に応じ CMEK(顧客管理鍵, Cloud KMS) を Pub/Sub トピックや Dataflow に適用。外部流出対策に VPC Service Controls を併用
サービスアカウントキー(JSON)をワーカーや設定ファイルに埋め込むのは NG。GCP 内ではワークロードに紐づくサービスアカウントを直接利用すれば、長期鍵の管理・漏洩リスクを排除できます。鍵をダウンロードして配るのは最終手段。
関連サービス・比較(AWS との対応)
| 観点 | GCP(Pub/Sub + Dataflow) | AWS(Kinesis) |
|---|---|---|
| リアルタイム取り込み | Pub/Sub(サーバーレス・シャード管理不要) | Kinesis Data Streams(シャード/オンデマンド) |
| 容量モデル | 自動スケール(パーティション概念なし) | シャード単位 or オンデマンド |
| ストリーム処理 | Dataflow(Apache Beam) | Managed Service for Apache Flink |
| ストレージへ自動配信 | BigQuery サブスクリプション / Dataflow テンプレート | Kinesis Data Firehose |
| 配信保証 | At-least-once(Exactly-once も選択可) | At-least-once(再読み込み可) |
| 順序 | 順序指定キー使用時のみ保証 | シャード内で順序保証 |
| 権限付与 | サービスアカウント + IAM | IAM ロール |
ハンズオン / CLI例
# 1) Pub/Sub のトピックとサブスクリプションを作成
gcloud pubsub topics create events
gcloud pubsub subscriptions create events-sub \
--topic=events \
--ack-deadline=30
# 2) メッセージをパブリッシュ / 取得して確認
gcloud pubsub topics publish events \
--message='{"click":1}' \
--attribute=user=user-123
gcloud pubsub subscriptions pull events-sub --auto-ack --limit=1
# 3) Google 提供テンプレートで Pub/Sub → BigQuery のストリーミングジョブを起動
gcloud dataflow jobs run ps-to-bq \
--gcs-location=gs://dataflow-templates/latest/PubSub_Subscription_to_BigQuery \
--region=asia-northeast1 \
--parameters=inputSubscription=projects/MY_PROJECT/subscriptions/events-sub,outputTableSpec=MY_PROJECT:demo.events
# 4) 実行中の Dataflow ジョブを一覧
gcloud dataflow jobs list --region=asia-northeast1 --status=active
Google Cloud Service
Pub/Sub + Dataflowを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
分析
比較で見る軸
クラウド: Google Cloud / カテゴリ: 分析 / 難易度: intermediate
導入後に効く点
シャード管理不要で自動スケール、バッチも同じコードで処理。
先に潰すリスク
サービス単体ではなく、権限、ネットワーク、監視、課金、バックアップを含めて設計する必要がある。
- クラウド
- Google Cloud
- カテゴリ
- 分析
- 難易度
- intermediate
- 関連資格
- —
- 設計柱
- performance / reliability / cost / operational
判断チェックリスト
- 自社の用途が「分析 / performance」に近いか確認する。
- 強みである「流れ続けるデータを Pub/Sub で受け、Dataflow で変換・集計。」が本当に評価軸になるか確認する。
- 注意点の「サービス単体ではなく、権限、ネットワーク、監視、課金、バックアップを含めて設計する必要がある。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。
他クラウドの同等サービス
役割が近いサービスです。設計の置き換えや比較検討の参考に。