🐟

Cloud Tasksで重複除去・スケジュール・レート

2024/03/05に公開

概要

Cloud Tasksは使いやすくて高機能なキューを提供します。
大抵のタスクをキューイングしたい場合、これだけのことが出来るなら十分ではないでしょうか。

https://cloud.google.com/blog/ja/products/serverless/buffer-http-requests-with-cloud-tasks/

Cloud Tasksの要約

AppEngineをターゲットサービス(ワーカーとしてタスクをサブスクリプション)するなら、キューのレベルでルーティングができるようで、キューにPushした後、配信先をガラッと変えてしまうといっったこともできるようです。このあたりは以下サンプルを交えて、動作確認は出来そうですが、今回は純粋にキューしたタスクから重複を除外したり、ターゲットサービスへのレートを制御したり、発火時間をスケジュールするなど、大抵の目的を満たす基本的な配信機能を確認出来ればと思います。
https://github.com/meteatamel/cloudtasks-samples/tree/main/tasks-buffer-pubsub-run

CLIで試す

サービスの有効化

gcloud services enable cloudtasks.googleapis.com eventarc.googleapis.com run.googleapis.com

キューの作成

この例では、同時実行中タスクを2として、タスクの空きが出来たら秒あたり2個までのタスクをターゲットサービスへ転送します。キューレベルで作成するので、ターゲットサービスの性能に応じた設定が必要で、用途や性能に応じてキューを作成します。

gcloud beta tasks queues create hoge-queue-name --location=asia-northeast1 --max-dispatches-per-second=2 --max-concurrent-dispatches=2

キューへタスクをPush

2024年3月5日14時10分00秒 JSTに指定URLに送信するようスケジュールします

gcloud tasks create-http-task hogeTaskId --queue=hoge-queue-name --url=https://8217-126-227-1-152.ngrok-free.app --method=POST --body-content=fugaMessage --location=asia-northeast1

ただ、同一タスクId(この場合、hogeTaskId)が規定値の過去4時間(or 9日)以内に送信されているなら、エラーになります。タスクIDも自らの設計で作れるので運用が楽ですね。渡さないこともでき、その場合はランダムな値になるので、重複除去されることはないようです。

ERROR: (gcloud.tasks.create-http-task) ALREADY_EXISTS: The task cannot be created because a task with this name existed too recently. For more information about task de-duplication see https://cloud.google.com/tasks/docs/reference/rest/v2/projects.locations.queues.tasks/create#body.request_body.FIELDS.task.

最後に

このステップだけで重複を除去し、スケジューリングとレート制御が可能なキューの完成です。
他にもリトライや重複除去の時間など、設定は他にもあるので、自社のニーズにあった運用を構築できるのではと思います。

Discussion