Amazon Simple Queue Service
开发人员指南
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

Amazon SQS 长轮询

长轮询 通过减少空响应的数量 (在没有消息可供返回以响应发送到 Amazon SQS 队列的 ReceiveMessage 请求时) 并消除假的空响应 (当消息在队列中可用但未包含在响应中) 来帮助降低您使用 Amazon SQS 的成本:

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

  • 长轮询通过查询所有服务器 (而不是有限数量的服务器) 消除假的空响应。

  • 只要任何消息变得可用,长轮询将立即返回消息。

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

默认情况下,Amazon SQS 使用短轮询,此时仅查询服务器的一个子集 (基于加权随机分布) 以确定是否有任何消息可包含响应中。

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

  • ReceiveMessage 调用将 WaitTimeSeconds 设置为 0

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

注意

对于 ReceiveMessageWaitTimeSeconds 参数,设置为介于 120 之间的值优先于为队列属性 ReceiveMessageWaitTimeSeconds 设置的任何值。

使用 AWS 管理控制台启用长轮询

通过将 Receive Message Wait Time 设置为大于 0 的值,您可以使用 AWS 管理控制台启用长轮询。

使用 AWS 管理控制台为新队列启用长轮询

  1. 登录 AWS 管理控制台并通过以下网址打开 Amazon SQS 控制台:https://console.amazonaws.cn/sqs/

  2. 选择 Create New Queue

  3. Create New Queue 对话框中,键入 Queue Name

  4. 对于 Receive Message Wait Time,键入 120 秒的一个正整数值。

  5. 选择 Create Queue

您可以使用 AWS 管理控制台更改现有队列的 Receive Message Wait Time 设置。

为现有队列设置新的“接收消息等待时间”值

  1. 选择队列。

  2. Queue Actions 下拉列表中,选择 Configure Queue

  3. 对于 Receive Message Wait Time,键入一个正整数值。

  4. 选择 Save Changes

使用 API 启用长轮询

下表列出了要使用的 API 操作。

请使用以下操作 使用...
ReceiveMessage

WaitTimeSeconds parameter

CreateQueue

ReceiveMessageWaitTimeSeconds 属性

SetQueueAttributes

ReceiveMessageWaitTimeSeconds 属性

重要

如果您决定对多个队列实施长轮询,我们建议对每个队列使用一个线程,而不是试图使用单一线程来轮询所有队列。

如果对每个队列使用一个线程,您的应用程序可以在队列变为可用后立即处理每个队列中的消息。对多个队列使用单个线程可能导致您的应用程序在等待 (最长 20 秒) 没有任何可用消息的队列时被阻止处理其他队列中的可用消息。

在大多数情况下,当使用长轮询时,将超时值设置为最大值 (20 秒)。如果 20 秒的最大值不适用于您的应用程序,请为长轮询设置更短的超时 (最小值为 1 秒)。如果您不使用 AWS 软件开发工具包访问 Amazon SQS,或者您将 AWS 软件开发工具包配置为具有较短的超时,则可能需要修改您的 Amazon SQS 客户端,才能允许时间更长的请求或对长轮询使用较短的超时。

使用查询 API 启用长轮询

以下示例通过调用 ReceiveMessage 操作并将 WaitTimeSeconds 参数设置为 10 秒来启用长轮询。

您构造 AUTHPARAMS 的方式取决于您签署 API 请求的方式。有关签名版本 4 中 AUTHPARAMS 的信息,请参阅 Amazon Web Services 一般参考 中的已签名的签名版本 4 请求示例

Copy
http://sqs.us-east-2.amazonaws.com/123456789012/testQueue/ ?Action=ReceiveMessage &WaitTimeSeconds=10 &MaxNumberOfMessages=5 &VisibilityTimeout=15 &AttributeName=All; &Version=2012-11-05 &Expires=2013-10-25T22%3A52%3A43PST &AUTHPARAMS

以下示例显示了启用长轮询的另一种方式。其中,SetQueueAttributes 操作的 ReceiveMessageWaitTimeSeconds 属性设置为 20 秒。

Copy
http://sqs.us-east-2.amazonaws.com/123456789012/testQueue/ ?Action=SetQueueAttributes &Attribute.Name=ReceiveMessageWaitTimeSeconds &Attribute.Value=20 &Version=2012-11-05 &Expires=2013-10-25T22%3A52%3A43PST &AUTHPARAMS