我正在寻求帮助! 我正在开发一个小项目,该项目涉及向 Google Pub/Sub 主题发布消息并使用“推送”订阅来触发 Cloud Run HTTPS 服务。 我遇到的问题是“推送”订阅的确认截止日期似乎没有得到遵守。我看到同一条消息在 Cloud Run 服务中生成多个容器,即使首次运行时尚未达到确认截止时间或请求超时。我只希望 1 条消息生成 1 个容器一次完成(返回 200 OK)。
当前流程(问题):
- 消息已发布到 pubsub 主题
- “推送”订阅(确认截止时间为 600 秒)将消息转发到 Cloud Run HTTPS 服务端点(请求超时时间为 600 秒)
- Cloud Run 服务开始处理此消息,此工作需要 120 秒
- 在处理过程中,同一条消息会重新触发一个新的 Cloud Run 服务容器(每 10 秒一次,直到第一个容器完成),从而为同一条消息生成多个容器。
- 第一个 Cloud Run 容器完成后,不会启动新的 Cloud Run 容器,并且每 10 秒停止接收一次消息。
预期流量(我想要的):
- 消息已发布到 pubsub 主题
- “推送”订阅(确认截止时间为 600 秒)将消息转发到 Cloud Run HTTPS 服务端点(请求超时时间为 600 秒)
- Cloud Run Service 仅使用 1 个容器处理此消息 120 秒。任何新消息都应在单独的容器上启动。
- Cloud Run 服务在 600 秒确认期限内完成处理,并且不会为同一消息生成新容器。
订阅说明:
gcloud pubsub subscriptions describe myBuildSubscription
ackDeadlineSeconds: 600
expirationPolicy: {}
messageRetentionDuration: 87000s
name: projects/myproject-12345/subscriptions/myBuildSubscription
pushConfig:
oidcToken:
serviceAccountEmail: <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="62010e0d17064f10170c4f1217001117004f0b0c140d090710220f1b12100d080701164f53505156574c0b030f4c05110710140b01070301010d170c164c010d0f" rel="noreferrer noopener nofollow">[email protected]</a>
pushEndpoint: https://my-project-example-ue.a.run.app
topic: projects/myproject-12345/topics/my_build_queue
其他信息: 我正在根据本教程进行工作:https://cloud.google.com/run/docs/tutorials/pubsub
我在 Pub/Sub 教程代码中添加了一个 sleep 函数,以模拟 120 秒的工作:
https://github.com/cvasq/golang-samples/commit/fa2286d4395d31b5eca12d73dd24187042211124
当前解决方法: 将最大容器数和每个容器的最大请求数设置为 1。这允许一次仅处理来自主题的 1 条消息。
任何人都可以提供一些关于为什么会发生这种情况的指示吗?配置看起来是正确的,但我可能遗漏了一些东西。
最佳答案
我能够通过在命令行上使用所需的截止日期和并发配置重新创建 pubsub 订阅和云运行服务来解决我的问题。
我第一次在命令行创建订阅和云运行服务,后来在 Google Cloud UI 中更改了确认截止时间。我怀疑由于某种原因,Google Cloud 后端没有进行此更改。
gcloud pubsub subscriptions create mySubscription --topic projects/myproject-123456/topics/build_queue --push-endpoint=https://myservice-ue.a.run.app --push-auth-service-account=cloud-run-pubsub-invoker@myproject-123456.iam.gserviceaccount.com --ack-deadline 600
gcloud run deploy --memory 2Gi site-build --image gcr.io/myproject-123456/site-builder --concurrency 1 --max-instances 10
关于google-cloud-platform - Google Pub/Sub + Cloud Run 生成多个容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60494164/