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

Skh*_*haz 4 google-cloud-platform google-cloud-pubsub

我将 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})
Run Code Online (Sandbox Code Playgroud)

设置 Cloud Scheduler(每个项目只需完成一次)

gcloud pubsub topics create supervisor-cron --project ${PROJECT_ID}
Run Code Online (Sandbox Code Playgroud)

创建 Pub/Sub 订阅

gcloud pubsub subscriptions create supervisor-subscription \
    --topic supervisor-cron \
    --project ${PROJECT_ID}
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

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

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

部署云运行

gcloud builds submit --tag gcr.io/${PROJECT_ID}/supervisor --project ${PROJECT_ID}
Run Code Online (Sandbox Code Playgroud)
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}
Run Code Online (Sandbox Code Playgroud)

使用服务帐户创建 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}
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)

gui*_*ere 6

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

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

--ack-deadline=600
Run Code Online (Sandbox Code Playgroud)

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