クラウドサービス

Pub/Sub + Dataflow

Pub/Sub で取り込んだストリーミングデータを Dataflow でリアルタイムにもバッチにも処理。スケーリングを任せられる GCP のストリーミング基盤。AWS の Kinesis に相当。

中級パフォーマンス効率信頼性コスト最適化運用上の優秀性
最終更新: 2026-06-13公式ドキュメント
3つの要点
TL;DR
  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。サブスクリプションのメッセージ保持は既定 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 deadline)までに応答できなければ再配信されるため、処理側は重複を前提にします。シャード(パーティション)という概念がなく、流量に応じて内部で自動的にスケールします。

Dataflow は Beam パイプラインを受け取り、各 PTransformワーカー VM 群に分散実行します。Pub/Sub 入力では最初の結合済み処理段と副作用を永続化した後に確認応答を返し、失敗時は Pub/Sub の再配信を利用します。ストリーミングではウォーターマークでデータの進捗を追跡し、ウィンドウトリガーで出力時点を決定。Streaming Engine は状態管理とシャッフルをワーカーから切り離し、オートスケールとリソース効率を高めます。

横にスクロール

データソースがPub/Subトピックとサブスクリプションへメッセージを送り、Dataflowが永続化後に確認応答を返し、ウィンドウ、ウォーターマーク、トリガーでイベント時刻集計を行い、BigQuery、Cloud Storage、Bigtableへ出力する流れ
Pub/Subはサブスクリプションごとに未処理メッセージを保持し、Dataflowは最初の処理段を永続化した後に確認応答を返します。ストリーム集計は到着順ではなくイベント時刻で窓へ割り当て、遅延データを許容遅延とトリガーで扱います。
Pub/Sub と Cloud Tasks の違い

Pub/Sub=多対多のストリーミング配信(ファンアウト・高スループット)Cloud Tasks=特定エンドポイントへのタスク配送(実行時刻やレート制御を細かく管理)。「ストリームを並列処理」なら Pub/Sub、「実行先・時刻・再試行をタスク単位で制御」なら Cloud Tasks を選ぶ。どちらも受信側は重複に耐える設計が必要です。

設計パターン / ベストプラクティス

  • 取り込み = Pub/Sub、処理 = Dataflow、保存先 = BigQuery / GCS / Bigtable の三段構成が王道
  • 単純な「ストリームを BigQuery へ流すだけ」なら、自前パイプラインを書かず Dataflow テンプレート(Pub/Sub Subscription to BigQuery など)や Pub/Sub の BigQuery サブスクリプションを使うと最小運用
  • 集計はイベント時刻ベースのウィンドウで行い、遅延データは許容遅延 (allowed lateness) とトリガーで制御
  • 重複に備え、ダウンストリームを冪等に設計する。DataflowではPub/SubのExactly-once配信を併用せず、DataflowのExactly-onceストリーミングモードまたはメッセージID / 業務IDによる重複排除を使う
  • 失敗メッセージはデッドレタートピックへ退避し、本流を止めない。最大配信試行回数は厳密な回数ではなくベストエフォート

運用・監視

  • Cloud Monitoring でメトリクスを監視。Pub/Sub は subscription/num_undelivered_messages(未処理バックログ)と subscription/oldest_unacked_message_age(最古の未確認応答メッセージの経過時間 = 遅延の指標)が重要
  • 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.publisherroles/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(再読み込み可)
順序順序指定キー使用時のみ保証シャード内で順序保証
権限付与サービスアカウント + IAMIAM ロール

ハンズオン / 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、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
  • 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。

次に確認する観点

分析performancereliabilitycostoperational

他クラウドの同等サービス

役割が近いサービスです。設計の置き換えや比較検討の参考に。