【发布时间】:2020-06-15 01:30:44
【问题描述】:
我正在寻求帮助! 我正在做一个小项目,该项目涉及将消息发布到 Google Pub/Sub 主题并使用“推送”订阅来触发 Cloud Run HTTPS 服务。 我遇到的问题是“推送”订阅的确认截止日期似乎没有得到尊重。即使在第一次运行时未达到 Ack 截止日期或请求超时,我也看到相同的消息在 Cloud Run 服务中生成多个容器。我只希望 1 条消息生成 1 个容器一次完成(返回 200 OK)。
当前流程(问题):
- 一条消息发布到 pubsub 主题
- “推送”订阅(确认截止时间为 600 秒)将消息转发到 Cloud Run HTTPS 服务端点(请求超时时间为 600 秒)
- Cloud Run Service 开始处理此消息,此工作需要 120 秒
- 在处理过程中,同一条消息会重新触发一个新的 Cloud Run 服务容器(每 10 秒一次,直到第一个容器完成),从而为同一条消息生成多个容器。
- 第一个 Cloud Run 容器完成后,不会启动新的 Cloud Run 容器,并且每隔 10 秒就会停止接收消息。
预期流量(我想要的):
- 一条消息发布到 pubsub 主题
- “推送”订阅(确认截止时间为 600 秒)将消息转发到 Cloud Run HTTPS 服务端点(请求超时时间为 600 秒)
- Cloud Run 服务仅使用 1 个容器处理此消息 120 秒。任何新消息都应在单独的容器上启动。
- Cloud Run 服务在 600 秒 Ack 截止期限内完成处理,并且不会为同一消息生成新容器。
订阅说明:
gcloud pubsub subscriptions describe myBuildSubscription
ackDeadlineSeconds: 600
expirationPolicy: {}
messageRetentionDuration: 87000s
name: projects/myproject-12345/subscriptions/myBuildSubscription
pushConfig:
oidcToken:
serviceAccountEmail: cloud-run-pubsub-invoker@myproject-12345.iam.gserviceaccount.com
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 教程代码中添加了睡眠功能,以模拟 120 秒的工作:
https://github.com/cvasq/golang-samples/commit/fa2286d4395d31b5eca12d73dd24187042211124
当前解决方法: 将容器的最大数量和每个容器的最大请求数设置为 1。这允许一次仅处理来自主题的 1 条消息。
谁能提供一些关于为什么会发生这种情况的指示?配置似乎正确,但我可能遗漏了一些东西。
【问题讨论】:
-
你的问题中没有代码,所以我们只能猜测。确保您的日志显示每 10 秒重新发送一次相同的消息 ID。最可能的问题是您不小心收到了消息。
-
请记住推送订阅,没有明确的 ack/nacks。成功代码被视为 ack,而 4xx/5xx 错误代码将导致消息被重新传递。我建议检查您的调用的响应。
-
嗨@JohnHanley,感谢您的关注。我用来复制问题的代码有一个 Github 链接。This is it
标签: google-cloud-platform google-cloud-pubsub google-cloud-run