1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Google Cloudにおける非同期イベント処理のサービス選定

1
Posted at

技術選定にだいぶ苦労した過去の私へ。

1. TL;DR

  • Cloud Tasks はHTTP ターゲットへ明示的に配信するタスク実行に向く。細かな レート制御/リトライ/スケジュールタスク単位の管理 が必要なら第一候補。Cloud Run との相性が非常に良い(最小インスタンス 0 でイベント駆動)。
  • Pub/Sub Push サブスクリプション はイベント通知のファンアウト/疎結合に強い。Cloud Run/Functions に HTTP POST で即時配信されるため、間欠的ワークロードでもゼロスケールが可能。
  • Pub/Sub Pull サブスクリプション は、ワーカーが自らメッセージを取りに行く。常時起動が前提になりがちで、バッチ処理や高スループット用途に適合。Cloud Run の「リクエスト駆動」モデルとは相性が悪いケースが多い。
  • 迷ったら「明示的呼び出し(ジョブ実行制御) =Cloud Tasks」「暗黙的通知(イベント配信/多対多) =Pub/Sub」。

2. 用語と前提

  • Cloud Run: リクエストやイベントに応じて自動スケール。トラフィックが無ければ 0 インスタンスに縮退可能。必要に応じて 最小インスタンス数を設定してウォーム保持もできる。
  • Cloud Tasks: HTTP/HTTPS でターゲット(例: Cloud Run エンドポイント)へタスクを プッシュ配信。キュー単位で レート制限リトライを構成できる。
  • Cloud Pub/Sub: トピックに発行されたメッセージをサブスクリプション経由で配信。Push(Pub/Sub→HTTP POST)と Pull(クライアントが取得)をサポート。


3. アーキテクチャ別の使い分け

3.1 Cloud Tasks(Push)× Cloud Run

ユースケース

  • ユーザーリクエストから切り離した非同期ジョブ実行(画像処理、メール送信、決済後処理など)。
  • レート制限明示的リトライポリシー遅延実行(schedule_time) が必要。

動作ポイント

  • Cloud TasksのSDKがタスクを登録。Tasks が スロットリングリトライ制御のもと、HTTP リクエストとして Worker にプッシュする。
  • Cloud Run はイベント到着時のみ起動できるため、最小インスタンス 0でコスト最適。必要なら最小インスタンスでコールドスタートを緩和。

長所/短所

  • ✅ 強力な レート制御/リトライ/スケジューリング。タスク単位の可視性。
  • ⚠️ Dead Letter Queue(DLQ)機能は限定的。監視/再処理設計で補う必要あり。

3.2 Pub/Sub Push × Cloud Run/Functions

ユースケース

  • イベント通知ファンアウト(複数消費者へ同一メッセージ配信)。依存を最小化した疎結合設計。
  • 間欠的にイベントが来るワークロードでも ゼロスケールで費用効率良く処理。

動作ポイント

  • Pub/Sub が push で HTTPS POST を送る。メッセージは Base64 データ(ラップ形式/アンラップ)を選択可。JWT による認証も設定可能。

長所/短所

  • 多対多の配信、グローバルスケール、高スループット。
  • ⚠️ 細かなレート制御は Cloud Tasksほどではない。順序保証は ordering keyでキー単位。

3.3 Pub/Sub Pull × 常時起動 Worker(VM/GKE 等)

ユースケース

  • 大量メッセージの バッチ処理、独自の フロー制御ACK期限管理が必要。

動作ポイント

  • ワーカーが StreamingPull/Pull API で能動取得し、処理後 ACK/NACK
  • 常時起動リソース(VM/GKE)と相性が良い。Cloud Run のゼロスケールとは設計思想が異なる。


4. Cloud Tasks と Pub/Sub の機能比較(要点)

観点 Cloud Tasks Pub/Sub
配信モデル 明示的HTTP ターゲットへ1対1プッシュ 暗黙的イベント配信(Push/Pull, 1対多可)
レート制御 キュー単位で明示的に制御 Pushは自動調整/Pullはクライアント側フロー制御
リトライ 詳細に構成可 基本的なリトライ(DLQ/フィルタ等あり)
スケジュール あり なし(遅延は別途工夫)
順序保証 ベストエフォート ordering key 単位で順序保持
メッセージサイズ 最大 1MB 最大 10MB
配信レート上限 500 QPS/キュー 実質上限なし(サービス設計による)
地理特性 リージョン グローバル

※上記は公式比較ページの要約。詳細は原文を参照。


5. 設計の勘所・ベストプラクティス

5.1 Cloud Run と組み合わせるとき

  • ゼロスケール前提なら Push(Cloud Tasks/Pub/Sub Push)を選ぶ。Pull は原則不適。
  • コールドスタートを許容しない場合は 最小インスタンスでウォーム保持。課金への影響はドキュメントを要確認。

5.2 セキュリティ

  • Cloud Tasks の HTTP ターゲットIAM サービスアカウントを使った認証呼び出しが可能。
  • Pub/Sub Push は JWT ベアラトークンによる認証を構成可能。受け側で検証を実装する。

5.3 信頼性/再処理

  • 冪等性を担保しましょう。Cloud Tasks/ Pub/Sub は at-least-once 配信。
  • Cloud Tasks の DLQは限定的。失敗タスクの処理を別途検討すべき。

6. 実装リファレンス(最小構成)

6.1 Cloud Tasks → Cloud Run(FastAPI)

  • API サービス: CloudTasksClient.create_task() で HTTP タスク作成。
  • Worker: Cloud Run の FastAPI で POST を受け取り、2xx なら成功、非2xx はリトライ。

6.2 Pub/Sub Push → Cloud Run(FastAPI)

  • Push 受信時のリクエストボディは Base64 エンコードされた message.data をデコードして処理。JWT 認証を有効化可。

6.3 Pub/Sub Pull → 常時起動 Worker

  • 高レベルクライアントの StreamingPull+非同期コールバックが推奨。ACK デッドラインの管理に留意。

7. 選定フローチャート

  1. Cloud Run ゼロスケールで動かしたい? → はい → Push(Cloud Tasks / Pub/Sub Push)
  2. 1対1の明示的タスク実行を制御したい?(レート/遅延/リトライの細かな設定) → はい → Cloud Tasks
  3. イベントのファンアウト/多対多が必要? → はい → Pub/Sub。Push or Pull を要件で選択。
  4. 高スループットのバッチ/常時起動ワーカーが前提? → はい → Pub/Sub Pull

8. コスト/運用の目安

  • Cloud Run: 最小インスタンス > 0 ならアイドルでも課金。最小 0 ならアイドル課金なし(リクエストベース課金)。
  • Cloud Tasks: タスク数/ディスパッチに応じた課金。キューでバッファして 過負荷回避が可能。
  • Pub/Sub: メッセージ量・保持ストレージ・配信に応じて課金。グローバルで高スループット。

9. まとめ

  • 「明示的タスク実行を厳密に制御」→ Cloud Tasks「疎結合のイベント配信・ファンアウト」→ Pub/Sub
  • Cloud Run を活かした ゼロスケール運用は Push型が基本。Pull は常時起動基盤と組み合わせる。
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?