Google Cloud PubSub 消息在到达截止日期确认时间之前多次发送

Par*_*ede 6 google-cloud-platform google-cloud-pubsub

背景:我们配置了云发布订阅主题以在多个应用引擎服务中进行交互,我们配置了基于推送的订阅者。我们已将其确认截止时间配置为 600 秒

问题:我们观察到 pubsub 已向其订阅者推送相同的消息两次(来自其他主题的两次以上),查看日志我可以看到此消息推送发生的间隔仅为 1 秒,理想情况下我们已将 ackDeadline 配置为600 秒后,pubsub 应仅在 600 秒后重新尝试传递消息。

需要以下答案:

  1. 为什么同一条消息仅在 1 秒内传递了不止一次

  2. 在重新尝试消息传递之前,pubsub 是否不遵守 ackDeadline 配置?

参考资料: - https://cloud.google.com/pubsub/docs/subscriber

Kam*_*osn 5

由于多种原因,可能会发生消息重新传递。首先,一条消息有可能被发布两次。有时,发布者会收到一条错误消息,例如超出截止日期,这意味着发布时间比预期要长。在这种情况下,该消息可能实际上已经发布,也可能没有发布。通常,正确的操作是发布者重试发布,事实上,这就是 Google 提供的客户端库默认执行的操作。因此,即使客户端仅收到其中一份的确认,也可能有两份已成功发布的消息副本。

其次,Google Cloud Pub/Sub 保证至少一次交付。这意味着有时,即使 ackDeadline 尚未过去或 ack 已发送回服务,消息也可以重新传送。致谢已尽最大努力,并且大多数情况下,服务都会成功处理它们。然而,由于网络故障、服务器重新启动以及其他此类情况的定期发生,有时订阅者发送的确认将不会被处理,从而导致消息重新传递。

订阅者应该被设计为能够适应这些偶尔的重新传递,通常是通过确保操作是幂等的,即多次处理消息的结果是相同的,或者通过跟踪和捕获重复项。或者,可以使用Cloud Dataflow作为订阅者来删除重复项