Google Pub/Sub + Cloud Run 生成多个容器
Posted
技术标签:
【中文标题】Google Pub/Sub + Cloud Run 生成多个容器【英文标题】:Google Pub/Sub + Cloud Run spawning multiple containers 【发布时间】: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 秒就会停止接收消息。
Screenshot
预期流量(我想要的):
-
一条消息发布到 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 【参考方案1】:我能够通过在命令行中使用所需的截止日期和并发配置重新创建 pubsub 订阅和云运行服务来解决我的问题。
我第一次在命令行创建订阅和云运行服务,后来在 Google Cloud UI 中更改了 Ack 截止日期。我怀疑由于某种原因,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 Pub/Sub + Cloud Run 生成多个容器的主要内容,如果未能解决你的问题,请参考以下文章
Google Cloud Pub/Sub - Cloud Function & Bigquery - 数据插入未发生
Google Cloud 上使用 Pub/Sub 的主/从模式