本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
针对 Amazon SQS ReceiveMessage API 调用未返回消息的问题进行排查
以下主题介绍了 Amazon SQS 消息可能无法返回给使用者的最常见原因以及如何进行问题排查。有关更多信息,请参阅《Amazon Knowledge Center 指南》中的“为什么我无法从我的 Amazon SQS 队列接收消息?”
空队列
要确定队列是否为空,请使用长轮询来调用 ReceiveMessage
API。您还可以使用 ApproximateNumberOfMessagesVisible
、ApproximateNumberOfMessagesNotVisible
和 ApproximateNumberOfMessagesDelayed
CloudWatch 指标。如果所有指标的值在几分钟内均为 0,则判断队列为空。
已达到传输中消息数量限制
如果您使用长轮询并且消息数量已超出队列的传输中消息数量限制(对于 FIFO 队列,默认值为 20000,对于标准队列,默认值为 120000),Amazon SQS 将不会返回以下错误消息:超出配额限制。
消息延迟
如果 Amazon SQS 队列配置为延迟队列,或者消息通过消息计时器发送,则在延迟时间结束之前消息不可见。要验证队列是否配置为延迟队列,请使用 GetQueueAttributes
API DelaySeconds
属性,或者从队列控制台的交付延迟下方查看相关信息。查看 CloudWatch 指标 ApproximateNumberOfMessagesDelayed,了解是否有任何消息延迟。
消息正在传输中
如果其他使用者对消息进行了轮询,则该消息将在可见性超时期间内处于传输中或不可见状态。额外的轮询可能返回空结果(即没有可接收的消息)。查看 CloudWatch 指标 ApproximateNumberOfMessagesVisible,了解可接收的消息的数量。对于 FIFO 队列,如果具有消息组 ID 的消息正在传输中,除非您删除该消息或该消息变为可见,否则系统不会再返回消息。这是因为消息顺序是在 FIFO 队列中的消息组级别进行维护的。
轮询方法
如果您使用短轮询(WaitTimeSeconds 为 0),Amazon SQS 会对服务器的一个子集进行采样,并且仅从这些服务器返回消息。因此,即使有可接收的消息,您也可能无法接收到它们。后续的轮询请求将会返回消息。
如果您使用长轮询,Amazon SQS 会轮询所有服务器,并在收集至少一条可用消息后,最多返回您指定的最大数量的消息。如果 ReceiveMessage WaitTimeSeconds 的值设置得过低,您可能无法接收到所有可用消息。