SQS 消息何时通过重新驱动策略发送到死信队列?

When is an SQS message sent to deadletter queue via redrive policy?

我有一个通过重新驱动策略链接到死信队列的 SQS 队列。 Terraform 示例:

  redrive_policy = jsonencode({
    deadLetterTargetArn = aws_sqs_queue.deadletter_queue.arn
    maxReceiveCount     = 10
  })

队列处理是用指数退避实现的。如果处理成功,消息将被简单地删除。如果处理失败,它会以 30 秒的初始 VisibilityTimeout 重试,每次加倍,最终重试超时(第 9 次和第 10 次尝试之间)大约为 2 小时。

我的问题是,在最后一次重试之后,消息何时发送到死信队列?在第 10 次尝试后立即还是必须等待 VisibilityTimeout(大约 4 小时)?

我担心的是,如果消息只是直接发送到死信,则在消息上设置可见性超时似乎是多余的 - 例如,这会延迟警报。

如果您有 4 小时的可见性超时,在第 10 次尝试后 SQS 将必须等待 4 小时 才能认为尝试失败。 SQS 不能假设 1 分钟后尝试失败,如果处理消息可能需要 4 小时。 SQS 不知道您对这些消息做了什么,也无法检查您的应用程序是否未能在可见性超时到期之前处理该消息。

假设您是 运行 2 个消费者,A 和 B。

可见超时是从“消费者A”收到消息后开始的一个时间段。在此期间,“消费者 B”无法接收消息(消息保留给“消费者 A”)。因此,可见性超时的目的是“隐藏”来自其他消费者的消息以避免重复,而其中一位消费者已经在处理它(另请参阅 aws doc here)。

关于这个问题,最后一次重试后,消息立即被移动到死信队列。它不会等待可见性超时结束,因为它不会有机会再次被消费。消息被移动到死信队列并从源队列中删除。