对 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 SQS 队列的消息? 在Amazon 知识中心指南中。

空队列

要确定队列是否为空,请使用长轮询来调用 ReceiveMessageAPI。您也可以使用ApproximateNumberOfMessagesVisibleApproximateNumberOfMessagesNotVisible、和ApproximateNumberOfMessagesDelayed CloudWatch 指标。如果在几分钟内将所有指标值都设置为 0,则队列将被视为空。

已达到飞行限制

如果您使用长轮询并且队列的飞行限制(FIFO 为20000,标准为默认值为120000),Amazon SQS 将不会返回超过配额限制的错误消息。

消息延迟

如果 Amazon SQS 队列配置为延迟队列,或者消息是使用消息计时器发送的,则在延迟时间结束之前消息才可见。要验证队列是否配置为延迟队列,请使用 GetQueueAttributesAPI DelaySeconds 属性,或者从队列控制台的 “传送延迟” 下方。检查ApproximateNumberOfMessagesDelayed CloudWatch 指标以了解是否有任何消息延迟。

消息正在传送中

如果其他消费者对消息进行了轮询,则该消息将在可见性超时时间内处于传输状态或不可见。额外的民意调查可能会返回空的接收结果。检查 V ApproximateNumberOfMessagesisible CloudWatch 指标以了解可接收的消息数量。对于 FIFO 队列,如果带有消息组 ID 的消息正在传输中,则除非您删除该消息或该消息变为可见,否则不会再返回任何消息。这是因为消息排序是在 FIFO 队列中的消息组级别维护的。

轮询方法

如果您使用的是短轮询,则(WaitTime秒数为 0)Amazon SQS 会对其服务器的子集进行采样,并仅返回来自这些服务器的消息。因此,即使消息可供接收,也可能无法收到。随后的民意调查请求将返回消息。

如果您使用的是长轮询,Amazon SQS 会轮询所有服务器,并在收集至少一条可用消息且不超过指定的最大数量后发送响应。如果 S ReceiveMessage WaitTimeec onds 的值太低,则可能无法收到所有可用消息。