PubSub:如何设置没有指数退避的重试策略?

Posted

技术标签:

【中文标题】PubSub:如何设置没有指数退避的重试策略?【英文标题】:PubSub: How to set a retry policy without exponential backoff? 【发布时间】:2021-12-03 03:57:19 【问题描述】:

我有一个向 Cloud Run 服务发送消息的推送订阅。如果 Cloud Run 服务未成功确认消息(否定确认),我希望重发消息的最大次数始终保持相同的重试时间间隔(例如,1 分钟后每次重试 10 次)。

    我知道我可以设置使用死信队列重新发送消息的最大次数(我是否也可以在没有死信队列的情况下设置此数字?所以只需在达到最大传递尝试次数后丢弃/删除消息没有消息进入另一个队列?)。 此外,通过重试策略,我可以设置最小回退(例如 1 分钟)来决定第一次重试发生的时间,但在那之后,PubSub 的重试策略会使用一些指数延迟。 我可以不在这里指定线性延迟(总是相同的时间间隔)吗?

这是否可以通过此处提到的 PubSub 推送订阅设置https://cloud.google.com/pubsub/docs/admin#using_subscription_properties 以某种方式实现?

提前感谢您的帮助。

【问题讨论】:

【参考方案1】: 推荐的答案 Google Cloud

在回答您的问题之前,我们必须了解 pubsub 如何处理重试:

默认情况下,pubsub 将尝试发送消息,直到它未被确认,因为 Pub/Sub 的设计是实现At least once delivery。根据设置的邮件保留时间(10 分钟到 7 天),将继续重新发送邮件。

    考虑到 pubsub 的行为,唯一的方法是使用你提到的死信队列。

    重试策略是立即重试或在指数退避延迟后重试。您不能在这两个选项上配置线性延迟。指数退避由 API 处理,并且根据SO answer 可能会随着时间的推移而发生变化。如果您正在实施“nack”,可能的解决方法是,您可以选择“立即重试”并在执行“nack”之前在脚本上添加延迟。有了这个,你可以控制你的 nacked 消息的固定延迟。

【讨论】:

感谢您的回答。我想避免在我的脚本中添加延迟,因为可能需要重新发送数千条消息。然后,如果我使用具有指数退避延迟的重试策略:我希望 2 次重试之间的时间间隔超过 10 分钟。在某个时间点(例如,重试 2 小时后,它应该是大约 30 分钟)。由于最大退避持续时间(重试之间的时间间隔)可以是 10 分钟。 PubSub 设置是否无法做到这一点? @MichaelW。不幸的是,不能超过 10 分钟,因为这是 API 的当前限制。

以上是关于PubSub:如何设置没有指数退避的重试策略?的主要内容,如果未能解决你的问题,请参考以下文章

GCP PubSub:“请求被中止,因为没有可用的实例。” - 不重试失败

Google Pub/Sub 的 RetryPolicy 中配置的指数退避如何工作?

AWS 中的错误重试和指数退避

AWS 中的错误重试和指数退避 Error Retries and Exponential Backoff in AWS

如何在 SqlDataAdapter/DataSet 上应用 ReliableSqlConnection 的重试策略

HBase客户端Rpc的重试机制以及客户端参数优化。