如何排查在调用 AWS SQS DeleteMessage API 时出现的 ReceiptHandleIsInvalid and InvalidParameterValue 错误?

上次更新日期:2021 年 8 月 16 日

当我尝试从 Amazon Simple Queue Service (Amazon SQS) 队列中删除消息时,我收到了 ReceiptHandleIsInvalid 或 InvalidParameterValue 错误。如何成功删除消息?

简短描述

每当收到来自 Amazon SQS 队列的消息时,您都会同时收到该消息的接收句柄。此句柄与接收消息的操作相关联,而不是与消息本身关联。要删除消息,您必须提供接收句柄。

根据您使用 FIFO 队列还是标准 SQS 队列以及接收句柄不正确还是过期,错误消息会有所不同。

FIFO SQS 队列

如果接收句柄不正确,那么你会看到类似于以下内容的错误:

调用 DeleteMessage 操作时发生错误 (ReceiptHandleIsInvalid):输入的接收句柄 'YOUR RECEIPT HANDLE' 不是有效的接收句柄。

对于 FIFO 队列,接收句柄会在可见性超时期限后过期。当接收句柄过期时,消息将返回队列。再次收到消息时,您会得到一个新的接收句柄。如果您尝试在可见性超时期限之外删除消息,则会看到类似于以下内容的错误:

调用 DeleteMessage 操作时发生错误 (InvalidParameterValue):参数 ReceiptHandle 的值 'YOUR RECEIPT HANDLE' 无效。原因:接收句柄已过期。

标准 SQS 队列

如果接收句柄不正确,那么你会看到类似于以下内容的错误:

调用 DeleteMessage 操作时发生错误 (ReceiptHandleIsInvalid):输入的接收句柄 'YOUR RECEIPT HANDLE' 不是有效的接收句柄。

对于标准队列,有时您可能会成功使用较旧的接收句柄。但是,最佳实践是对 DeleteMessage API 调用使用最新的接收句柄。使用较旧的接收句柄可能会引发类似于以下内容的错误:

调用 DeleteMessage 操作时发生错误 (InvalidParameterValue):参数 ReceiptHandle 的值 'YOUR RECEIPT HANDLE' 无效。原因:接收句柄已过期。

解决方法

为了防止无效或过期的接收句柄错误,必须使用正确的接收句柄在 SQS 队列可见性超时期限内删除消息。

如果您多次收到消息,请查看最近的 ReceiveMessage API 调用响应并确定 ReceiptHandle 值。然后,在调用 DeleteMessage API 时,使用标识的 ReceiptHandle 值。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?