首页 文章

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

提问于
浏览
0

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

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

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

1 回答

  • 3

    TLDR :您想查看ChangeMessageVisibility API .

    Details

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

    如果您的进程需要花费的时间超过配置的可见性超时,则它本质上需要向SQS发送一些信号,表示"I'm still alive and working on this message" . 这就是 ChangeMessageVisibility 的用途 .

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

    注意,对于批量消息,还有ChangeMessageVisibilityBatch这样做 .

相关问题