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

如果我们为英文版本指南提供翻译,那么如果存在任何冲突,将以英文版本指南为准。在提供翻译时使用机器翻译。

Amazon SQS temporary queues

临时队列可帮助您在使用常规消息模式(如 request-response)时节省开发时间和部署成本。您可以使用临时队列客户端来创建高吞吐量、经济高效和应用托管的临时队列。

客户端映射多个 temporary queues—针对特定流程的需求创建的应用程序管理队列—一个单个 Amazon SQS 队列自动。当指向每个临时队列的流量较低时,这就使得您的应用程序发出较少的 API 调用,实现更高的吞吐量。当临时队列不再使用时,客户端自动清除临时队列,即使部分使用客户端的进程没有完全关闭也是如此。

以下是临时队列的优势:

  • They serve as lightweight communication channels for specific threads or processes.

  • They can be created and deleted without incurring additional cost.

  • They are API-compatible with static (normal) Amazon SQS queues. This means that existing code that sends and receives messages can send messages to and receive messages from virtual queues.

主题

Virtual queues

Virtual queues 是临时队列客户端创建的本地数据结构。使用虚拟队列让您可以将多个低流量目标合并成单个 Amazon SQS 队列。有关最佳实践,请参阅 Avoid reusing the same message group ID with virtual queues

注意
  • Creating a virtual queue creates only temporary data structures for consumers to receive messages in. Because a virtual queue makes no API calls to Amazon SQS, virtual queues incur no cost.

  • TPS quotas apply to all virtual queues across a single host queue. For more information, see 与消息相关的配额.

AmazonSQSVirtualQueuesClient 包装程序类增加了对与虚拟队列相关属性的支持。要创建虚拟队列,您必须使用 HostQueueURL 属性调用 CreateQueue API 操作。此属性指定托管虚拟队列的现有队列。

虚拟队列 URL 采用以下格式。

https://sqs.us-east-2.amazonaws.com/123456789012/MyQueue#MyVirtualQueueName

创建者在虚拟队列 URL 上调用 SendMessageSendMessageBatch API 操作时,临时队列客户端执行以下操作:

  1. 提取虚拟队列名称。

  2. 将虚拟队列名称作为额外的消息属性进行附加。

  3. 发送消息到主机队列。

当创建者发送消息时,后台线程轮询主机队列,并根据对应的消息属性将收到的消息发送到虚拟队列。

当使用者在虚拟队列 URL 上调用 ReceiveMessage API 操作时,临时队列客户端在本地阻止调用,直至后台线程将消息发送到虚拟队列中。(此过程与在 缓冲异步客户端:单个API操作可以向多达10个虚拟队列提供消息。)删除虚拟队列不会调用任何客户端资源 Amazon SQS 本身。

AmazonSQSTemporaryQueuesClient 类自动将它创建的所有队列转入临时队列中。它还会自动使用相同的队列属性,按需创建主机队列。这些队列的名称共用共同的可配置前缀(默认情况下为 __RequesterClientQueues__),该前缀将队列标识为临时队列。这使得客户端充当了简易替代,可优化创建和删除队列的现有代码。客户端还包括 AmazonSQSRequesterAmazonSQSResponder 接口,以允许队列之间的双向通信。

Request-response messaging pattern (virtual queues)

临时队列的最常用用例是 request-response 消息传递模式,请求者创建 temporary queue 用于接收每个响应消息。为了避免为每个响应消息创建 Amazon SQS 队列,临时队列客户端允许您创建和删除多个临时队列而无需进行任何 Amazon SQS API 调用。有关更多信息,请参阅 Implementing request-response systems。)

下图显示了使用此模式时的常见配置。


                    请求响应模式图 Amazon SQS.

Example scenario: Processing a login request

以下示例场景展示了如何使用 AmazonSQSRequesterAmazonSQSResponder 接口来处理用户的登录请求。

On the client side

public class LoginClient { // Specify the Amazon SQS queue to which to send requests. private final String requestQueueUrl; // Use the AmazonSQSRequester interface to create // a temporary queue for each response. private final AmazonSQSRequester sqsRequester = AmazonSQSRequesterClientBuilder.defaultClient(); private final LoginClient(String requestQueueUrl) { this.requestQueueUrl = requestQueueUrl; } // Send a login request. public String login(String body) throws TimeoutException { SendMessageRequest request = new SendMessageRequest() .withMessageBody(body) .withQueueUrl(requestQueueUrl); // If no response is received, in 20 seconds, // trigger the TimeoutException. Message reply = sqsRequester.sendMessageAndGetResponse(request, 20, TimeUnit.SECONDS); return reply.getBody(); } }

发送登录请求将执行以下操作:

  1. 创建一个临时队列。

  2. 将临时队列的 URL 作为属性附加到消息。

  3. 发送消息。

  4. 从临时队列接收响应。

  5. 删除临时队列。

  6. 返回响应。

On the server side

以下示例假设在构造时创建了一个线程,它为每个消息轮询该队列并调用 handleLoginRequest() 方法。此外,假设使用了 doLogin() 方法。

public class LoginServer { // Specify the Amazon SQS queue to poll for login requests. private final String requestQueueUrl; // Use the AmazonSQSResponder interface to take care // of sending responses to the correct response destination. private final AmazonSQSResponder sqsResponder = AmazonSQSResponderClientBuilder.defaultClient(); private final AmazonSQS(String requestQueueUrl) { this.requestQueueUrl = requestQueueUrl; } // Process login requests from the client. public void handleLoginRequest(Message message) { // Process the login and return a serialized result. String response = doLogin(message.getBody()); // Extract the URL of the temporary queue from the message attribute // and send the response to the temporary queue. sqsResponder.sendResponseMessage(MessageContent.fromMessage(message), new MessageContent(response)); } }

Cleaning up queues

为确保 Amazon SQS 回收虚拟队列使用的任何内存中资源,应用程序不再需要临时队列客户端时,它应调用 shutdown() 方法。您还可以使用 AmazonSQSRequester 接口的 shutdown() 方法。

临时队列客户端还提供了一种方法来消除孤立的主机队列。对于在一段时间内(默认情况下为 5 分钟)接收 API 调用的每个队列,客户端使用 TagQueue API 操作来标记仍在使用的队列。

注意

在队列上执行的任意 API 操作将标记为非空闲,包括不返回任何消息的 ReceiveMessage 操作。

后台线程使用 ListQueuesListTags API 操作,以检查具有已配置前缀的所有队列,并删除至少五分钟内没有被标记的所有队列。这样,如果一个客户端未完全关闭,则其他活动客户端在之后会进行清除。为了减少重复工作,具有相同前缀的客户端会通过共享的内部工作队列通信,该队列以前缀命名。