Amazon SQS 短轮询和长轮询 - Amazon Simple Queue Service
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

Amazon SQS 短轮询和长轮询

Amazon SQS 提供短轮询和长轮询以接收来自队列的消息。默认情况下,队列使用短轮询。

使用短轮询时,ReceiveMessage 请求仅查询服务器的一个子集(基于加权随机分布),以查找可包含在响应中的消息。 即使查询没有找到消息,Amazon SQS 也会立即发送响应。

使用长轮询 时,ReceiveMessage 请求会查询所有服务器中的消息。Amazon SQS 在收集至少一条可用消息(最多为可在请求中指定的最大消息数)后发送响应。仅当轮询等待时间过期时,Amazon SQS 才发送空响应。

以下部分解释短轮询和长轮询的详细信息。

通过短轮询来使用消息

当通过短轮询从队列中使用消息时,Amazon SQS 会对其一部分服务器(基于加权随机分布)进行采样,并且仅从这些服务器返回消息。因此,特定 ReceiveMessage 请求可能不会返回您的所有消息。但是,如果您的队列中的消息少于 1,000 条,一个后续请求将返回您的消息。如果继续从您的队列中使用消息,则 Amazon SQS 会对其所有服务器进行采样,然后您将收到您的所有消息。

下图显示了系统组件之一发出接收请求后从标准队列返回的消息的短轮询行为。Amazon SQS 对其若干服务器(显示为灰色)进行采样并从这些服务器返回消息 A、C、D 和 B。系统不会为此请求返回消息 E,但将为后续请求返回该消息。


                    使用短(标准)轮询的消息采样

通过长轮询来使用消息

ReceiveMessage API 操作的等待时间大于 0 时,长轮询将起作用。长轮询最长等待时间为 20 秒。 长轮询通过消除空响应的数量(ReceiveMessage 请求时没有消息可用时)并消除假的空响应(消息可用但未包含在响应中)来帮助降低您使用 Amazon SQS 的成本。 有关使用 AWS 管理控制台或 AWS SDK for Java(以及 CreateQueueSetQueueAttributesReceiveMessage 操作)为新队列或现有队列启用长轮询的信息,请参阅教程:配置 Amazon SQS 队列的长轮询教程。有关最佳实践,请参阅 设置长轮询

长轮询具有以下好处:

  • 在发送响应之前,允许 Amazon SQS 等到队列中的消息可用为止,从而消除空响应。除非连接超时,否则对 ReceiveMessage 请求的响应将至少包含一条可用的消息,并且最多包含 ReceiveMessage 操作中指定的最大数量的消息。

  • 通过查询所有 — 服务器而不是服务器子集来消除假的空响应—Amazon SQS。

    注意

    当您执行长轮询且 ApproximateNumberOfMessagesDelayedApproximateNumberOfMessagesNotVisibleApproximateNumberOfMessagesVisible 指标在创建者停止发送消息之后的至少 1 分钟内等于 0 时(当队列元数据达到最终一致性时),您可以确认队列是空的。有关更多信息,请参阅 CloudWatch 的可用 Amazon SQS 指标

  • 在消息可用时立即返回消息。

长轮询和短轮询之间的区别

如果以下列两种方式之一将 WaitTimeSeconds 请求的 ReceiveMessage 参数设置为 0,则会出现短轮询:

  • ReceiveMessage 调用将 WaitTimeSeconds 设置为 0

  • ReceiveMessage 调用不会设置 WaitTimeSeconds,但队列属性 ReceiveMessageWaitTimeSeconds 将设置为 0