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"

删除队列会删除未完成任务,仅对实验队列执行。

搜索文档

输入关键词,搜索所有文档。

↑ ↓ 选择 · Enter 打开 · Esc 关闭