GOOGLE CLOUD 実践 / 非同期処理

Cloud Tasks と Pub/Sub — 非同期処理を「命令」と「イベント」で分ける

どちらもメッセージを後で処理するが、Cloud Tasks は特定の処理を確実に依頼するキュー、Pub/Sub は起きた事実を複数の購読者へ伝えるイベント基盤だ。

TL;DR

  1. 1対1・配信時刻・レート制限・細かな再試行なら Cloud Tasks。
  2. 1対Nのファンアウト・大量イベント・購読者の独立性なら Pub/Sub。
  3. どちらも少なくとも一度は届く前提なので、受け手の冪等性が必要。

01全体像 — 「やってほしい」と「起きた」を分ける

Cloud Tasks は「この Worker にこの時刻で HTTP 処理してほしい」という明示的な依頼。Pub/Sub は「注文が成立した」という事実を複数チームに独立配信する。

全体像 — 「やってほしい」と「起きた」を分ける
Cloud Tasks は指定した HTTP 処理へ、Pub/Sub はトピックから複数の購読者へ配信する。

Tasksは仕事の依頼、Pub/Subは事実の通知

02Cloud Tasks が向く条件

キュー単位でレートと同時ディスパッチ数を制御できる。外部 API を守りながら再試行し、必要なら将来時刻に実行する用途に向く。

Cloud Tasks が向く条件
指定時刻、流量制御、1対1配信、リトライを表現する。

Tasksの強みは配信の制御

03Pub/Sub が向く条件

publisher はイベントを出すだけで、在庫・通知・分析などの subscriber を後から足せる。少なくとも一度の配信を前提に、各 subscriber は冪等にする。

Pub/Sub が向く条件
購入イベントが決済・在庫・分析へ独立配信される。

Pub/Subは購読者を増やせる

結論

  1. Cloud Tasks は制御された仕事の依頼、Pub/Sub は拡張可能な事実の配信。
  2. 比較表ではなく、送信側が受け手を知るべきかで最初に分ける。
  3. 失敗・重複に備え、受け手の処理は冪等に設計する。