如何在 GCP Pub/sub 中修复来自推送订阅的多条消息

Posted

技术标签:

【中文标题】如何在 GCP Pub/sub 中修复来自推送订阅的多条消息【英文标题】:How to fix multiple messages from Push Subscription in GCP Pub/sub 【发布时间】:2020-02-14 19:39:53 【问题描述】:

我有一个 Cloud Pub/Sub Push 订阅,它将相同消息的多个实例推送到一个处理端点 i GAE。我可以跟踪消息 ID,它是多次推送的同一条消息。

我已将 ack-timeout 设置为 600 秒,但它仍然会推送一些消息的多个实例。在消息之外没有得到“确认”,什么会触发这种行为?有人遇到同样的问题吗?

我运行的实例越多,问题似乎就越大,但即使使用 basic_scaling 和 max_instances: 1 问题仍然存在。

我可以在 GAE 中看到一堆 503 错误,但如果我理解正确,这不是问题,因为这些消息会自动“重试”但 Pub/Sub。

【问题讨论】:

你能分享代码(或简化版)吗?出了点问题。 GAE 中的代码并不重要。事实证明,这是 Pub/Sub 的一个众所周知的问题。 Pub/Sub 是“至少一次交付”,预计会有重复。要解决这个问题,请阅读此处获取灵感,cloud.google.com/blog/products/serverless/… 【参考方案1】:

我将其发布为答案,因为我没有足够的声誉来发表评论。 :)

您已经知道,一旦 Pub/Sub 向订阅者发送消息,订阅者应该确认该消息。任何未确认的消息,Cloud Pub/Sub 将重复尝试传递(检查here)。这意味着偶尔会出现duplicates。但是,高重复率可能表明客户端未在配置的 ack_deadline_seconds 内确认消息,并且 Cloud Pub/Sub 正在重试消息传递。 如果 Pub/Sub 系统成功并且您的消息正在被确认(检查 here 和 here),或者如果有太多重复项(检查 here 和 here),您可以使用 Stackdriver 到 monitor )。

【讨论】:

【参考方案2】:

事实证明,这是 Pub/Sub 的一个众所周知的问题。 Pub/Sub 是“至少一次交付”,预计会有重复。要解决此问题,请阅读此处获取灵感,https://cloud.google.com/blog/products/serverless/cloud-functions-pro-tips-building-idempotent-functions

【讨论】:

以上是关于如何在 GCP Pub/sub 中修复来自推送订阅的多条消息的主要内容,如果未能解决你的问题,请参考以下文章

将来自不同项目的服务帐户分配给 Pub/Sub 上的推送订阅

如何在云 pub/sub 上获取订阅的消息?

GCP Pub/Sub 消息发送到创建主题之前存在的订阅

确认后 GCP 消息保留在 Pub/Sub 中

Dataflow 是不是应该使用来自 Pub/Sub 主题或订阅的事件? [复制]

GCP Pub/Sub,如果已有活动订阅,您能否在新订阅上重播旧消息