针对 Amazon SQS ReceiveMessage API 调用未返回消息的问题进行排查 - Amazon Simple Queue Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

针对 Amazon SQS ReceiveMessage API 调用未返回消息的问题进行排查

以下主题介绍了 Amazon SQS 消息可能无法返回给使用者的最常见原因以及如何进行问题排查。有关更多信息,请参阅《Amazon Knowledge Center 指南》中的“为什么我无法从我的 Amazon SQS 队列接收消息?”

空队列

要确定队列是否为空,请使用长轮询来调用 ReceiveMessage API。您还可以使用 ApproximateNumberOfMessagesVisibleApproximateNumberOfMessagesNotVisibleApproximateNumberOfMessagesDelayed 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 的值设置得过低,您可能无法接收到所有可用消息。