AWS SQS 消息保留期限

27
根据文档,SQS消息最大保留期限(MessageRetentionPeriod)为14天。超过此时间后,消息将从队列中被删除。
在SQS中是否有一种方法可以在其保留期限到期后不丢失这些消息?例如,使用死信队列是否可行并不清楚。

我很好奇为什么这对你来说是个问题。在消息队列的典型用例中,让消息在队列中停留数小时甚至数天是不常见的。 - Michael - sqlbot
6
我有数百万个批处理任务,预计需要1-2个月完成,我还需要在14天后保留队列中的消息! - Jingpeng Wu
2个回答

16

你最多可以保留14天的消息,超过14天后,你可以将该消息移动到S3 Bucket进行备份。此外,你还可以通过DLQ来进行某些处理。

下面是一个快速的hack,你可以将那个消息发送回主队列。这绝不是最佳或推荐的选项。

  1. 将主SQS队列设置为实际DLQ的DLQ,并将最大接收次数设置为1。
  2. 查看DLQ中的内容(这将将消息移动到主队列,因为这是实际DLQ的DLQ)
  3. 取消设置,使主队列不再是实际DLQ的DLQ

谢谢您的回答。还有一个问题 - 消息以什么形式备份到S3 Bucket中?这是自动过程吗? - alexanoid
1
不,它不是自动的,您需要使用Cli来自动化并将那些消息从SQS移动到S3。 - error2007s
不,你必须在保留期之前完成这个任务。 - error2007s
1
@alexanoid 你可以使用轮询的 Lambda 函数来检查 DLQ 并将数据备份到 S3 存储桶中。 - Chamin Wickramarathna
31
如何增加保留期?以下是AWS文档中的原文:“消息的过期始终基于其原始入队时间。当消息移动到死信队列时,入队时间戳不会更改。例如,如果一条消息在移动到死信队列之前在原始队列中停留了1天,并且dl队列的保留期设置为4天,则该消息将在3天后从dl队列中删除。”来源-https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-dead-letter-queues.html - Rishabh Dugar
显示剩余2条评论

0
与网络上一些答案或博客文章相反: RedrivePolicy不会影响消息在到达队列的保留期(RetentionPeriod)后的处理。
AWS文档明确说明消息会被删除,从未提及RedrivePolicy的作用。

https://aws.amazon.com/sqs/faqs/#Limits_and_restrictions

问:我可以在Amazon SQS消息队列中保留多长时间的消息?
更长的消息保留时间提供了更大的灵活性,允许在消息生产和消费之间的时间间隔更长。
您可以将Amazon SQS消息保留期配置为1分钟到14天的值。默认值为4天。一旦达到消息保留配额,您的消息将被自动删除。

https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SetQueueAttributes.html

MessageRetentionPeriod - Amazon SQS保留消息的时间长度,以秒为单位。有效值:表示秒数的整数,从60(1分钟)到1,209,600(14天)。默认值:345,600(4天)。当您更改队列的属性时,大多数属性的更改可能需要最多60秒才能在整个Amazon SQS系统中传播。对MessageRetentionPeriod属性的更改可能需要最多15分钟,并且会影响队列中的现有消息,如果将MessageRetentionPeriod减少到现有消息的年龄以下,可能会导致这些消息过期并被删除。
所以DLQ在这里无法帮助您,而且在保留期过后,您的消息将会被永久删除,恐怕无法恢复。
附注:有人可能会认为缺乏指示不足以证明这一点,这种观点是正确的。
我也基于上周发生在我身上的真实生产事件来回答这个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接