Google Cloud PubSub 禁用重试或设置最小值

Posted

技术标签:

【中文标题】Google Cloud PubSub 禁用重试或设置最小值【英文标题】:Google Cloud PubSub disable retrying or set a minimum 【发布时间】:2021-08-16 01:12:41 【问题描述】:

我正在将 Cloud Scheduler 与 PubSub 和 Cloud Run 结合使用。

有时我的服务会被多次触发,即使我的服务在 Cloud Run 上运行成功响应(HTTP 204 无内容)也是如此。

我的服务用了大约 200 秒来响应 PubSub 发出的 POST。

我的问题是:如何限制 PubSub 的尝试次数?还是我犯了多个订阅之类的错误(我只有一个订阅,只是在控制台上检查过)?

奇怪的是,当我触发 Cloud Scheduler 时,PubSub 多次调用我的服务(见下面的截图)

我正在按如下方式部署我的 PubSub 和 Cloud Run:

export PROJECT_ID=...
export PROJECT_NUMBER=$(gcloud projects describe --format 'value(projectNumber)' $PROJECT_ID)

设置 Cloud Scheduler(每个项目只需执行一次)

gcloud pubsub topics create supervisor-cron --project $PROJECT_ID

创建 Pub/Sub 订阅

gcloud pubsub subscriptions create supervisor-subscription \
    --topic supervisor-cron \
    --project $PROJECT_ID

在https://console.cloud.google.com/cloudscheduler创建一个云调度器

启用 Pub/Sub 以在您的项目中创建身份验证令牌

gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member=serviceAccount:service-$PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
    --role=roles/iam.serviceAccountTokenCreator

创建或选择一个服务帐户来代表 Pub/Sub 订阅身份

gcloud iam service-accounts create cloud-run-pubsub-invoker \
     --display-name "Cloud Run Pub/Sub Invoker" \
     --project $PROJECT_ID

部署 Cloud Run

gcloud builds submit --tag gcr.io/$PROJECT_ID/supervisor --project $PROJECT_ID
gcloud run deploy supervisor \
    --set-env-vars APP_BASEURL=$(gcloud run services describe anotherservice --format 'value(status.url)' --platform managed --project $PROJECT_ID) \
    --set-env-vars APP_HEALTHCHECKS=https://hc-ping.com \
    --platform managed \
    --no-allow-unauthenticated \
    --timeout=900 \
    --image gcr.io/$PROJECT_ID/supervisor \
    --project $PROJECT_ID

使用服务帐号创建 Pub/Sub 订阅

gcloud run services add-iam-policy-binding supervisor \
    --member=serviceAccount:cloud-run-pubsub-invoker@$PROJECT_ID.iam.gserviceaccount.com \
    --role=roles/run.invoker \
    --platform managed \
    --project $PROJECT_ID
gcloud pubsub subscriptions create supervisor-subscription \
    --topic supervisor-cron \
    --push-endpoint=$(gcloud run services describe supervisor --format 'value(status.url)' --platform managed --project $PROJECT_ID) \
    --push-auth-service-account=cloud-run-pubsub-invoker@$PROJECT_ID.iam.gserviceaccount.com

【问题讨论】:

【参考方案1】:

您需要延长 PubSub 订阅中的 ACK 截止日期。

在创建时添加此参数。最大值为 600 秒(10 分钟)。

--ack-deadline=600

您还可以设置其他参数来设置每次重试之间的延迟、最大重试次数等。看看here

【讨论】:

完美。非常感谢

以上是关于Google Cloud PubSub 禁用重试或设置最小值的主要内容,如果未能解决你的问题,请参考以下文章

Google Cloud Pub/Sub 重试次数

Google Cloud Tasks HTTP 触发器 - 如何禁用重试

Google Cloud Function - 检测是不是发生重试

google.cloud.pubsub_v1 和 google.cloud.pubsub 有啥区别?

如何使用 Google PubSub 确认 (@google-cloud/pubsub)

Google Cloud Function - ImportError:无法从“google.cloud”(未知位置)导入名称“pubsub”