从SQS FIFO队列中删除消息:收据句柄已过期

问题描述 投票:1回答:2

我切换到FIFO队列,当我尝试从队列中删除消息时,我收到此错误消息

Value {VALUE} for parameter ReceiptHandle is invalid. Reason: The receipt handle has expired.

似乎错误发生是因为我试图在visibility timeout过期后删除该消息。我将默认可见性超时0更改为最大值,12小时,这部分解决了问题。有时可能会发生消息仍然在我的队列中超过12小时才能执行它而不是删除它,所以我将再次收到错误。是否有任何解决方案可以将可见性超时提高超过12小时或以其他方式绕过此错误?

amazon-web-services queue amazon-sqs
2个回答
5
投票

TLDR:您想查看ChangeMessageVisibility API。

细节

可见性超时的原因是确保处理消息的进程没有意外死亡,并允许消息由其他工作程序处理。

如果您的进程需要花费的时间超过配置的可见性超时,那么它本质上需要向SQS发送一些信号,说明“我还活着并正在处理此消息”。这就是ChangeMessageVisibility的用途。

如果消费和处理消息所需的时间差异很大,我建议设置一个小的默认可见性超时并让你的工作人员发出“心跳”(使用ChangeMessageVisibility)来表明他们还活着并且正在工作信息。这样,当工人合法地失败时,您仍然可以相对快速地恢复。

请注意,还有ChangeMessageVisibilityBatch用于批量消息。


1
投票

尝试使用ReceiptHandle增加sqs.receive_message()中VisibilityTimeout参数的值,以获取要删除的邮件

© www.soinside.com 2019 - 2024. All rights reserved.