GCPのCloud TasksとPub/Subの使い分け
GCPにはCloud TasksとPub/Subという似たサービスがある。
ドキュメントをざっと読んだ感じ、
- Cloud Tasks : Webシステムとかで非同期タスクを作りたい場合に使う。
- コストはめちゃ安い
- ただしdead letterがない
- Pub/Sub : IoTとかで大量メッセージを配信したい場合が想定されている。Job Queueでつかってもいい。
- 小規模ならほぼ無料だが、従量課金の単位がデカいのでやはり大規模向きが想定されてる
- dead letterがある
という使い分けでよさそう。
機能比較表。ぶっちゃけこれを読んでもよくわからん。
注意点は、Cloud Tasksでは
- キューの順序保証がない(ベストエフォート)
- 配信レート上限が500 QPS/キュー
あたりか。
プロダクトの分類を見たら良かったかも。
Cloud Taskは「デベロッパーツール」配下で「非同期でタスクを実行するためのタスク管理サービス。」
Pub/Subは「データ分析」配下で「イベントの取り込みと配信のためのメッセージング サービス。」
料金プランはCloud Tasksの方がめちゃくちゃシンプルだし、安い。中規模利用ぐらいまでなら無料枠で済むレベル。
一方のPub/Subはストレージやスループットで計算。かなり複雑。
このあたりからも、単にタスクを非同期化したいだけならCloud Tasksを使っとけという話になる。
Cloud Tasksにはdead letterがない。ちょっとこれは面倒だなあ
Cloud Tasksは監視できるメトリクスがかなり少ない。下記の4つだけ。
- api/request_count
- queue/depth
- queue/task_attempt_count
- queue/task_attempt_delays
Pub/Subの料金をちゃんと読んだ。
- Topicへのメッセージ流入量
- Subscriptionへのメッセージ流入量(紐づけているSubscriptionの分だけ増える)
- TopicおよびSubscriptionでメッセージを保持するために必要なストレージ
- Pub/Subから外部へのネットワーク転送料金
Job Queueとして考えると、
- リクエストメッセージ受付用のTopic/Subscription 1本ずつ
- Dead Letter用のTopic/Subscription 1本ずつ
があればよくて、正常に動作していればDead Letterの方にはメッセージはほぼ流れないはず。
そうなると、Job Queueの料金としては、メインのTopic/Subscriptionを通るデータ量がほとんど料金になってくると考えればよい。10GB以下は無料、以降は4TBごとに$40。
メッセージサイズが10KBぐらいだと仮定すると、500Kメッセージぐらいまでは無料で扱える。Job Queue用途で4TBを超えることはないだろうから、大規模になると$40かかるぐらいの気持ちで十分そう。
なお、蛇足だが、昔はGB単位で従量課金してたっぽい。
Cloud Tasksにはdead letterがないので、「あくまでもトリガー」として考えて設計することになりそう。
- 要求メッセージ自体の本体は別途DBに書き込んでおいて、Cloud Tasksにも要求が来たことを投げる
- 処理が完了したメッセージには処理完了フラグを立てる
- 処理に失敗したようなケースは、後からタイマートリガーからの起動で拾う
みたいな構成ならあり。
Pub/Sub、Cloud Tasksともにメッセージの遅延(スケジュール)がある。これは地味に便利。