AWS SQS FIFO DLQ:在消息保留到期之前消息已移至 DLQ

AWS SQS FIFO DLQ: Message has been moved to DLQ before Message retantion expiring

差不多就是标题。

我的 lambda 无法处理来自我的 FIFO SQS queue 的一些消息。可见性超时设置为 18 分钟,消息保留期设置为 4 天。

据我了解,我的消费 lambda 将尝试每 18 分钟处理一次消息,持续 4 天。然而,这些失败消息中只有一部分已在 4 天前移至 DLQ 方式。

我在这里遗漏了什么吗?

另外,因为它是一个 FIFO queue:假设有一系列 - [1,2,3,4],传入我的 queue 的消息具有相同的 GroupID。 如果消息 1 失败,则不会处理消息 2、3、4。这样对吗?假设消息 1 在 4 天后移至 DLQ,那么消息 2 将尝试被消费,依此类推。我的理解正确吗?

提前致谢。

您还需要在队列上配置 maxReceiveCount 设置。这决定了在将单个消息移动到 DLQ 之前将重试多少次。我认为默认值是 1,所以在一次失败后,一条消息将被移动到 DLQ。

消息保留期 - 这是消息在您不处理的情况下保留在队列中的最长时间。所以,这并不意味着它会被处理 4 天,每 18 分钟处理一次。这是因为您可以在服务器上拥有自己的工作人员 运行,而不必使用 Lambda 函数。如果你使用 Lambda,它几乎是瞬时的,但如果你使用你自己的服务器,你可能会有停机时间并且工作人员不可用,所以在这种情况下,你希望将消息保留一段时间以便能够处理它们之后。消息保留期最长可达 14 天。

您使用的是 FIFO 队列,它具有“恰好一次传递”策略。这意味着当您使用 FIFO 队列时,您只能处理一次消息。如果您想将失败的消息留在队列中并 re-process 它们,则必须使用常规队列。当您使用标准队列时,您可以设置将消息移动到 DLQ 之前的处理尝试次数(通常为 3-4,但您可以设置自己的值)。

在您的示例中,消息将按照 SQS 接收消息的确切顺序发送。它不会等待检查消息 1 是否被处理,因为 FIFO 队列具有“exactly once delivery”,您可以使用多个 worker 来处理消息。由于您使用的是 Lambda 函数,它们将很快被 SQS 触发。