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 的主/从模式

如何修改后台 Cloud Function 的 Google Cloud Pub/Sub 订阅确认截止日期

Google Cloud Pub/Sub 确认

Google Cloud Pub/Sub 获取或创建订阅

Google Cloud Functions 无法使用 Pub/Sub 死信主题