如何在 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 上的推送订阅