2017-10-09 148 views
0

我切换到FIFO队列,当我试图从队列从SQS FIFO队列中删除消息:收到手柄已过期

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

看来,发生错误的删除消息,我得到这个错误信息因为我试图在visibility timeout过期后删除该邮件。我将默认可见性超时0更改为最长12小时,这部分解决了问题。有时可能会发生这样的情况:我的队列中有超过12个小时的信息仍然存在,并且不能将其删除,因此我将再次收到错误消息。有没有解决方案可以将可见性超时提高超过12小时或以其他方式绕过此错误?

回答

1

TLDR:您想查看ChangeMessageVisibility API。

详细

原因可见性超时是确保搬运过程中消息没有意外死亡,并允许由不同的工人来处理的消息。

如果您的过程需要比配置的可见性超时更长的时间,它实际上需要向SQS发送一些信号,说明“我还活着并处理此消息”。这就是ChangeMessageVisibility的用途。

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

请注意,还有ChangeMessageVisibilityBatch这样做的批量消息。