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

Google Cloud PubSub disable retrying or set a minimum

我正在将 Cloud Scheduler 与 PubSub 和云一起使用 运行。

有时我的服务被触发不止一次,即使我的服务 运行 在云 运行.

上的响应成功(HTTP 204 无内容)

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

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

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

我正在部署我的 PubSub 和云 运行 如下:

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

创建一个 Cloud Scheduler

启用 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

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

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

部署云运行

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

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

创建时添加此参数。 600s(10分钟)是最大值。

--ack-deadline=600

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