🐟
Cloud Tasksで重複除去・スケジュール・レート
概要
Cloud Tasksは使いやすくて高機能なキューを提供します。
大抵のタスクをキューイングしたい場合、これだけのことが出来るなら十分ではないでしょうか。
AppEngineをターゲットサービス(ワーカーとしてタスクをサブスクリプション)するなら、キューのレベルでルーティングができるようで、キューにPushした後、配信先をガラッと変えてしまうといっったこともできるようです。このあたりは以下サンプルを交えて、動作確認は出来そうですが、今回は純粋にキューしたタスクから重複を除外したり、ターゲットサービスへのレートを制御したり、発火時間をスケジュールするなど、大抵の目的を満たす基本的な配信機能を確認出来ればと思います。
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