TL

Cloud Service

Pub/Sub + Dataflow

Pub/Sub でストリーミングデータを取り込み、Dataflow(Apache Beam)でリアルタイム/バッチ処理する GCP のストリーミング基盤。AWS の Kinesis に相当。

中級パフォーマンス効率信頼性コスト最適化運用上の優秀性
最終更新: 2026-06-03公式ドキュメント ↗
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。未確認(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=多対多のストリーミング配信(ファンアウト・高スループット)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.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

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

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