我计划使用 AWS FIFO SQS 来记录数据存储中每个项目的当前状态。我将使用每个项目的唯一标识符作为 messageGroupId,以确保每个项目的消息严格排序。
SQS 是否确保如果属于特定组的消息位于 DLQ 中,则在删除 DLQ 消息或重新驱动回主队列之前,消费者看不到来自该组的消息?
例如,可以依次收到以下三个消息:
(groupIdA, M1)
(groupIdA, M2)
(groupIdA, M3)
我的轮询器成功消耗了 M1,但无法处理 M2。它会尝试直到 maxReceive 计数耗尽并且消息由 SQS 推送到 DLQ。现在,我还有另一条消息M3等待被消费。我想确保 M3 仅在 M2 成功消费后才得到处理。
根据 FIFO 队列的定义,它应该做类似确保严格排序的事情。但是,我无法在 AWS 文档中找到对此支持的确切提及。有人可以帮我吗?
在 DLQ 中的失败消息重新提交到源队列并由消费者处理之前,来自同一 FIFO 源队列组的 SQS 消息似乎不会被阻塞。
本文档中有一个要点暗示了这一点:https://aws.amazon.com/de/blogs/compute/using-amazon-sqs-dead-letter-queues-to-control-message-failure /
如果您不想破坏消息或操作的确切顺序,不要将死信队列与 FIFO 队列一起使用。例如,不要将死信队列与视频编辑套件的编辑决策列表 (EDL) 中的指令一起使用,其中更改编辑顺序会更改后续编辑的上下文。
它明确表示,将 DLQ 与 FIFO 源队列一起使用可以打破排序。
因此,即使使用 FIFO 队列,一旦失败的消息最终进入 DLQ,那么消费者将收到来自同一组的后续消息。