Cloud Tasks:派发、限速与重试
验证:未记录
- 适用版本
- 未记录
- 验证范围
- 尚未登记验证记录。
对指定 HTTP 目标派发任务;Console:Cloud Tasks → Queue。
推荐做法#
- 用 max-dispatches-per-second 和 max-concurrent-dispatches 保护下游,按实际容量设置。
- HTTP 调用身份单独授 Run Invoker;OIDC audience 使用目标要求的服务 URL。
- 处理器必须幂等;耗尽重试后的业务状态、告警与补偿由应用记录。
常用操作#
替换为实际资源;本段不依赖 lab.env。
PROJECT_ID='REPLACE_PROJECT_ID'
REGION='REPLACE_REGION'
QUEUE='REPLACE_QUEUE'
gcloud tasks queues describe "$QUEUE" \
--project="$PROJECT_ID" --location="$REGION"
gcloud tasks list --queue="$QUEUE" \
--project="$PROJECT_ID" --location="$REGION"容易踩的坑#
- 队列限速允许突发,不是精确的每秒时钟;task name 去重也不保证业务只执行一次。
Cloud Tasks 没有 Pub/Sub 同款 dead-letter topic;删除 Queue 会删除未完成任务。 重试耗尽后的失败状态、告警与补偿必须由业务保存和处理。
配置说明与完整示例(按需展开)
适合“请求这个 HTTP 服务完成一项工作”,常用于邮件发送、第三方 API 调用与延迟任务。Pub/Sub 更适合多个订阅者接收业务事件;两者不保证业务天然只执行一次。
前置:Cloud Run的 lab-hello,ingress 为 all、IAM 私有。需要 Cloud Tasks Admin;生产提交者可收敛为指定队列的 Cloud Tasks Enqueuer 加指定 SA 的 actAs。
做过 IAP Web 实验时,先关闭 IAP、恢复 Invoker IAM check;本篇使用 Cloud Run ID token 认证,ingress 和调用者权限须满足上述前置条件。
选型比较见 异步服务选择。
创建 Queue 与 Task#
source lab.env
gcloud services enable cloudtasks.googleapis.com
export TASK_SA="lab-tasks@$PROJECT_ID.iam.gserviceaccount.com"
export HUMAN_EMAIL=$(gcloud config get-value account)
export RUN_URL=$(gcloud run services describe lab-hello --region="$REGION" --format='value(status.url)')
gcloud iam service-accounts create lab-tasks
gcloud iam service-accounts add-iam-policy-binding "$TASK_SA" --member="user:$HUMAN_EMAIL" --role=roles/iam.serviceAccountUser
gcloud run services add-iam-policy-binding lab-hello --region="$REGION" --member="serviceAccount:$TASK_SA" --role=roles/run.invoker
gcloud tasks queues create lab-http \
--location="$REGION" \
--max-dispatches-per-second=1 \
--max-concurrent-dispatches=1 \
--max-attempts=3
gcloud tasks create-http-task lab-ok \
--queue=lab-http \
--location="$REGION" \
--url="$RUN_URL/" \
--method=GET \
--oidc-service-account-email="$TASK_SA" \
--oidc-token-audience="$RUN_URL"验收:请求 200,任务成功后从活动队列移除。Google 管理的 Cloud Tasks service agent 需要保留默认服务角色,它与 TASK_SA 不同。HTTP task
失败与重试#
gcloud tasks queues update lab-http --location="$REGION" --min-backoff=30s --max-backoff=60s
gcloud tasks create-http-task lab-fail \
--queue=lab-http \
--location="$REGION" \
--url="$RUN_URL/not-found" \
--method=GET \
--oidc-service-account-email="$TASK_SA" \
--oidc-token-audience="$RUN_URL"
gcloud tasks describe lab-fail --queue=lab-http --location="$REGION"在任务达到重试上限前查看 dispatch/response 信息,在 Cloud Run 日志确认 404 和多次请求。限速不是精准的每秒时钟,队列使用令牌桶等机制,可能有突发。
Cloud Tasks 不提供 Pub/Sub 同款死信 topic;重要任务需要业务状态表、失败告警与补偿流程。任务名去重有时间范围,仍需要业务幂等键。任务参数
清理#
gcloud tasks queues pause lab-http --location="$REGION"
gcloud tasks queues delete lab-http --location="$REGION"
gcloud run services remove-iam-policy-binding lab-hello --region="$REGION" --member="serviceAccount:$TASK_SA" --role=roles/run.invoker
gcloud iam service-accounts delete "$TASK_SA"删除队列会删除未完成任务,仅对实验队列执行。