为什么我无法从我的 Amazon SQS 队列接收消息?

1 分钟阅读
0

我调用了我的 Amazon Simple Queue Service (Amazon SQS) 队列的 ReceiveMessage API,但没有返回任何消息。

简短描述

在您使用 SendMessageSendMessageBatch API 调用向 Amazon SQS 队列发送消息后,ReceiveMessage API 调用可以检索这些消息。当 ReceiveMessage API 调用在队列中找不到任何消息时,它会返回空的接收结果。

注意:MaxNumberOfMessages 参数指定返回的最大消息数为 10,默认值为 1。

有关详细信息,请参阅消息生命周期

解决方法

确认消息已发送

使用 Amazon CloudWatch NumberOfMessagesSent 指标检查消息是否已发送到 Amazon SQS 队列。您可以使用 Amazon SQS SendMessageSendMessageBatch API 操作来检查是否有已发送的消息:

检查消息重复数据删除情况

由于 Amazon SQS 先入先出 (FIFO) 队列不会引入重复消息,因此队列可能会被删除重复数据。检查消息重复数据删除情况以确认消息在 5 分钟的重复数据删除间隔内发送。

检查是否存在消息延迟

您配置为延迟队列的 Amazon SQS 队列将在延迟期内推迟。使用消息计时器发送的消息在延迟时间结束之前不可见。

要检查您是否为队列配置了传送延迟或消息计时器,请使用 ApproximateNumberOfMessagesDelayed CloudWatch 指标。

检查轮询模式

消息可能会传送到 SQS 队列,但不可用于轮询。有关 Amazon SQS 轮询的详细信息,请参阅使用适当的轮询模式

短轮询

即使查询未找到任何消息,也会立即返回短轮询响应。Amazon SQS 对其部分服务器进行采样,并仅从这些服务器返回消息。有关详细信息,请参阅通过短轮询使用消息

长轮询

长轮询使用其所有服务器来查询消息。Amazon SQS 在收集了至少一条可用消息(不超过指定的最大数量)后会发送响应。仅当轮询等待时间到期时才返回空响应。当队列包含的消息为 ReceiveMessage 等待时间指定了较低值时,您可能会收到空响应。有关详细信息,请参阅通过长轮询使用消息

检查来自同一个组 ID 的消息是否在传输中

FIFO 队列的消息排序保持在消息组级别。使用消息组 ID 接收的消息不会为同一组 ID 返回更多消息,除非您删除该消息,或者该消息变为可见。消息可能会传送到队列中,但在传输中或不可见时可能不可用。

要检查组 ID 的消息是否在传输中或不可见,请使用 NumberOfMessagesReceivedApproximateNumberOfMessagesNotVisible CloudWatch 指标。

有关详细信息,请参阅为什么我的 Amazon SQS FIFO 队列没有返回所有消息或其他消息组中的消息?

确认消息可用或可见

如果其他使用者对该消息进行了轮询并且该消息正在传输中或不可见,则其他轮询可能会返回空白的接收。要检查是否没有可接收的消息,请使用 ApproximateNumberOfMessagesVisibleApproximateNumberOfMessagesNotVisible CloudWatch 指标。

检查队列是否为空

要确定队列是否为空,请使用长轮询调用 ReceiveMessage API。您还可以使用 ApproximateNumberOfMessagesVisibleApproximateNumberOfMessagesNotVisibleApproximateNumberOfMessagesDelayed CloudWatch 指标。如果在几分钟内将所有指标值设置为 0,则队列为空。

有关详细信息,请参阅确认队列为空

联系 AWS Support 进行故障排除

如果上述故障排除步骤均无法解决问题,请联系 AWS Support。在与 AWS Support 的沟通中,请包含消息请求的 RequestId 和带有 timezone(时区)的 timestamp(时间戳)。

相关信息

我如何才能知道谁使用了我的 Amazon SQS 队列消息?

如何防止 Amazon SQS 队列中积压的消息越来越多?

Amazon SQS FIFO 队列入门

AWS 官方
AWS 官方已更新 1 年前