如何配置启用死信的 Google Pubsub 订阅?

How to configure a Google Pubsub subscription with dead-letter enabled?

我有一个简单的设置,包含一个主题和一个订阅。使用的API有一些严格的限制,所以最终目标是尽可能避免垃圾邮件,以免被禁止。

我有一个 max_delivery_attempts 设置为 5(最小​​可能值)的死信主题,以便在 5 次 nack 或超时后清除消息。

还有一些参数ack_deadline_secondsmessage_retention_duration,我可能不太理解。

如果我没理解错的话,ack_deadline_seconds 定义了消息被视为失败之前应该经过多长时间。粗略地说,这类似于被nacked。

message_retention_duration 定义消息在积压中存储的时间长度。这是我不明白的。默认值为 10 天,这听起来有点矫枉过正。

我没理解错吗,这么高的值对于我的死信主题来说意义不大?所有的消息都将发送到主题中,甚至没有机会积压这么久。

一般来说,我如何为这些参数得出一组合理的值?

字段 ack_deadline_secondsmessage_retention_duration 控制非常不同的东西。 ack_deadline_seconds 是已收到消息的订户在重新传送消息之前必须确认消息的时间量。如果您的订阅者多次未确认此消息,则将 max_delivery_attempts 设置为 5,大约需要 5 * ack_deadline_seconds 消息才能在死信主题中结束(并被 Cloud Pub/Sub 这样它就不会再次发送给您的订阅者。

您为 ack_deadline_seconds 使用的值是在订阅者处理消息的时间超过此时间时重复消息的可能性与订阅者收到消息时消息的延迟处理之间的权衡,但是在它可以处理消息之前就崩溃了。请注意,Cloud Pub/Sub 客户端库允许您设置截止日期和每次应延长截止日期的时间,从而允许更精细地控制此权衡。 Pub/Sub settings post 的流量控制设置部分对此进行了更详细的介绍。

message_retention_duration 字段控制消息保留多长时间以传递给订阅者。如果有一段时间您的订阅者不是 运行,这一点很重要。即使您设置了死信队列,如果由于您的订户停机而没有尝试发送,积压中的消息也不会写入死信主题。换句话说,如果您的订阅者宕机时间超过 message_retention_duration,那么在此之前发布的消息将被删除。

您应该根据几个不同的因素为 message_retention_duration 选择一个值:

  1. 您预计您的订阅者可能会宕机多长时间?你会希望持续时间至少这么长。
  2. 是否存在消息不再与您的订阅者相关的年龄?如果是这种情况,您可以将 message_retention_duration 设置为此值。