当前位置: 首页 > 知识库问答 >
问题:

AWS FIFO SQS:当消息卡在DLQ中时,SQS如何保持组中的顺序?

祁霖
2023-03-14

我计划使用AWS FIFO SQS在我的数据存储中记录每个项目的当前状态。我将使用每个项目的唯一标识符作为messageGroupId,以确保对每个项目的消息进行严格排序。

SQS是否确保如果属于特定组的消息在DLQ中,则在DLQ消息被删除或重新驱动回主队列之前,该组的消息对消费者不可见?

例如,可以按顺序接收以下三条消息

(groupIdA, M1)
(groupIdA, M2)
(groupIdA, M3)

我的轮询器成功地消耗了M1,但无法处理M2。它一直尝试,直到maxReceive计数用尽,并且消息由SQS推送到DLQ。现在,我还有另一条消息M3等待被消费。我想确保只有在M2被成功消费后,M3才会被处理。

根据FIFO队列的定义,它应该做一些类似于确保严格排序的事情。但是,我找不到AWS文档中支持的确切提及。有人能帮我吗?

共有1个答案

解柏
2023-03-14

在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队列,一旦失败的消息最终出现在DQL中,那么消费者将收到来自同一组的稍后消息。

 类似资料:
  • 将消息从死信队列移回Amazon SQS中的原始队列的最佳实践是什么? 是吗 从DLQ获取消息 将消息写入队列 从DLQ删除消息 还是有更简单的方法? 此外,AWS最终会在控制台中提供一个工具来将消息移出DLQ吗?

  • 我在配置了DLQ的SQS队列上有一个lambda触发器。 当我的lambda失败时,来自队列的原始消息将被重定向到DLQ。现在我想添加更多的信息到这个原始的消息(如为什么有一个错误等)。我知道我不能修改原始消息,但我看到消息可以有额外的消息属性。 如何从lambda函数(NodeJS)使用/设置它们?

  • 主要内容:面试题剖析,解决方案面试题剖析 我举个例子,我们以前做过一个 mysql binlog 同步的系统,压力还是非常大的,日同步数据要达到上亿,就是说数据从一个 mysql 库原封不动地同步到另一个 mysql 库里面去(mysql -> mysql)。常见的一点在于说比如大数据 team,就需要同步一个 mysql 库过来,对公司的业务系统的数据做各种复杂的操作。 你在 mysql 里增删改一条数据,对应出来了增删改

  • 我不熟悉Kinesis,当我阅读Kinesis文档时,我意识到使用相同分区键的消息将映射到相同的切分以保证顺序。这完全有道理。然而,我想知道,如果我们在运行时增加主题碎片的数量,具有相同分区键的新消息是否会像以前一样散列到相同的碎片(旧的)中? 如果是这样,如果所有消息都提供了分区键,那么它们都不会映射到新的分片怎么办?这对我来说没有意义。 如果没有,那么Kinesis如何保证具有相同分区键的消息

  • 面试题 如何保证消息的顺序性? 面试官心理分析 其实这个也是用 MQ 的时候必问的话题,第一看看你了不了解顺序这个事儿?第二看看你有没有办法保证消息是有顺序的?这是生产系统中常见的问题。 面试题剖析 我举个例子,我们以前做过一个 mysql binlog 同步的系统,压力还是非常大的,日同步数据要达到上亿,就是说数据从一个 mysql 库原封不动地同步到另一个 mysql 库里面去(mysql -

  • > 如果请求中没有指定SentTimestamp属性,那么当Amazon在sqs中接收消息时,它是否将其系统时间戳作为SentTimestamp值? 从我的实验来看,即使我在请求中指定了SentiTimestamp属性,我确实看到Amazon没有将该值作为消息sentTimeStamp。 如果我的本地系统时钟与NTP服务器不同步,是否会对SentTimestamp属性产生任何影响?