Amazon SQS 短轮询和长轮询 - Amazon Simple Queue Service

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

Amazon SQS 短轮询和长轮询

Amazon SQS 提供了用于从队列接收消息的短轮询和长轮询选项。在这两个轮询选项之间进行选择时,请考虑您的应用程序对响应能力和成本效益的要求:

  • 短轮询(默认)-ReceiveMessage请求查询服务器子集(基于加权随机分布)以查找可用消息并立即发送响应,即使未找到任何消息。

  • 长轮询-在所有服务器上ReceiveMessage查询消息,在至少有一条消息可用时发送响应,不超过指定的最大值。只有在轮询等待时间到期时才会发送空响应。此选项可以减少空响应的数量,并有可能降低成本。

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

通过短轮询来使用消息

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

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

使用简短(标准)轮询进行消息采样

通过长轮询来使用消息

ReceiveMessage API 操作的等待时间大于 0 时,长轮询生效。最长长轮询等待时间为 20 秒。长轮询通过消除空响应的数量(ReceiveMessage 请求时没有消息可用时)并消除假的空响应(消息可用但未包含在响应中),帮助降低使用 Amazon SQS 的成本。有关使用 Amazon SQS 控制台为新队列或现有队列启用长轮询的信息,请参阅使用 Amazon SQS 控制台配置队列参数。有关最佳实践,请参阅在 Amazon SQS 中设置长时间投票

长轮询具有以下好处:

  • 在发送响应之前,允许 Amazon SQS 等到队列中的消息可用为止,从而消除空响应。除非连接超时,否则对 ReceiveMessage 请求的响应将至少包含一条可用的消息,并且最多包含 ReceiveMessage 操作中指定的最大数量的消息。在极少数情况下,即使队列中仍包含消息,您也可能会收到空响应,尤其是在您为 ReceiveMessageWaitTimeSeconds 参数指定的值较低的情况下。

  • 通过查询所有(而不是其子集)Amazon SQS 服务器来减少错误空响应。

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

有关如何确认队列为空的信息,请参阅确认亚马逊 SQS 队列为空

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

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

  • ReceiveMessage 调用将 WaitTimeSeconds 设置为 0

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