我有一个 SQS 队列通过重新驱动策略链接到死信队列。地形样本:
redrive_policy = jsonencode({
deadLetterTargetArn = aws_sqs_queue.deadletter_queue.arn
maxReceiveCount = 10
})
队列处理是通过指数退避实现的。如果处理成功,则消息将被简单删除。如果处理失败,它会以 30 秒的初始
VisibilityTimeout
重试,每次加倍,最终重试超时(第 9 次和第 10 次尝试之间)大约为 2 小时。
我的问题是,最后一次重试后,消息什么时候发送到死信队列?第 10 次尝试后立即还是必须等待
VisibilityTimeout
(大约 4 小时)?.
我担心的是,如果消息只是直接发送到死信,那么对消息设置可见性超时似乎是多余的 - 例如,这会延迟警报。
如果您的可见性超时为 4 小时,则在第 10 次尝试后 SQS 将必须等待 4 小时,然后才能认为该尝试不成功。如果处理消息可能需要 4 小时,则 SQS 不能假设尝试在 1 分钟后失败。 SQS 不知道您对消息做了什么,也无法检查您的应用程序在可见性超时到期之前是否无法处理消息。
假设您正在运行 2 个消费者,A 和 B。
可见超时是“消费者A”收到消息后开始的时间段。在此期间,“消费者 B”无法接收消息(消息是为“消费者 A”保留的)。因此,可见性超时的目的是向其他消费者“隐藏”消息,以避免重复,而其中一个消费者已经在处理该消息(另请参阅 aws 文档此处)。
关于问题,最后重试后,消息立即移至死信队列。它不会等待可见性超时结束,因为它没有机会再次被消耗。消息被移动到死信队列并从源队列中删除。
要回答您的问题,是的,它会在第 10 次尝试后立即发送到 DLQ,如果您设置了重新驱动策略,那么根据您的配置(返回源队列或自定义目标),它会从 DLQ 重试尝试