本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
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 秒。长轮询通过消除空响应的数量 (在没有消息可用时) 来帮助降低您使用 Amazon SQS 的成本。ReceiveMessage
请求) 和假的空响应 (消息可用但未包含在响应中)。有关使用 Amazon SQS 控制台为新队列或现有队列启用长轮询的信息,请参阅配置队列参数(控制台). 有关最佳实践,请参阅 设置长轮询。
长轮询具有以下好处:
-
在发送响应之前,允许 Amazon SQS 等到队列中的消息可用为止,从而减少空响应。除非连接超时,否则对
ReceiveMessage
请求的响应将至少包含一条可用的消息,并且最多包含ReceiveMessage
操作中指定的最大数量的消息。在极少数情况下,即使队列仍包含消息,也可能会收到空响应,尤其是如果您为ReceiveMessageWaitTimeSeconds
参数。 -
通过查询所有 (而不是子集) Amazon SQS 服务器,从而减少假的空响应。
-
在消息可用时立即返回消息。
有关如何确认队列为空的信息,请参阅。确认队列为空.
长轮询和短轮询之间的区别
如果以下列两种方式之一将 WaitTimeSeconds
请求的 ReceiveMessage
参数设置为 0
,则会出现短轮询:
-
ReceiveMessage
调用将WaitTimeSeconds
设置为0
。 -
ReceiveMessage
调用不会设置WaitTimeSeconds
,但队列属性ReceiveMessageWaitTimeSeconds
将设置为0
。