本文主要是介绍aws SQS临时队列,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在使用请求-响应等常见的消息模式时,临时队列帮助你节省开发时间和部署成本。你可以使用临时队列客户端来创建高吞吐量、低成本、应用管理的临时队列。
该客户端将多个临时队列–为特定进程按需创建的应用管理的队列–自动映射到单个Amazon SQS队列。这允许您的应用程序进行更少的API调用,并在每个临时队列的流量较低时拥有更高的吞吐量。当一个临时队列不再使用时,客户端会自动清理临时队列,即使一些使用客户端的进程没有被干净地关闭。
以下是临时队列的好处。
1.它们作为特定线程或进程的轻量级通信通道。
2.它们可以被创建和删除而不产生额外的费用。
3.它们与静态(正常)Amazon SQS队列的API兼容。这意味着现有的发送和接收消息的代码可以向虚拟队列发送消息和从虚拟队列接收消息。
虚拟队列
虚拟队列是临时队列客户端创建的本地数据结构。虚拟队列让你把多个低流量的目的地合并到一个Amazon SQS队列中。
AmazonSQSVirtualQueuesClient包装类增加了对虚拟队列相关属性的支持。要创建一个虚拟队列,必须使用 HostQueueURL 属性调用 CreateQueue API 动作。这个属性指定了托管虚拟队列的现有队列。
虚拟队列的URL的格式如下。
https://sqs.us-east-2.amazonaws.com/123456789012/MyQueue#MyVirtualQueueName
当生产者在虚拟队列URL上调用SendMessage或SendMessageBatch API动作时,临时队列客户端会做以下工作:
1.提取虚拟队列名称。
2.将虚拟队列名称作为一个额外的消息属性。
3.将消息发送到主机队列。
当生产者发送消息时,一个后台线程会轮询主机队列,并根据相应的消息属性将收到的消息发送到虚拟队列。
当消费者在虚拟队列URL上调用ReceiveMessage API动作时,临时队列客户端在本地阻止调用,直到后台线程将消息送入虚拟队列。(这个过程类似于缓冲异步客户端中的消息预取:一个API动作可以向多达10个虚拟队列提供消息)。删除一个虚拟队列会删除任何客户端的资源,而不需要调用Amazon SQS本身。
AmazonSQSTemporaryQueuesClient类将其创建的所有队列自动变成临时队列。它还会根据需要自动创建具有相同队列属性的主机队列。这些队列的名称共享一个共同的、可配置的前缀(默认为__RequesterClientQueues__),以确定它们是临时队列。这使得客户端可以作为一个直接的替代品,优化创建和删除队列的现有代码。该客户端还包括AmazonSQSRequester和AmazonSQSResponder接口,允许队列之间进行双向通信。
请求-响应的消息传递模式(虚拟队列)
临时队列最常见的使用情况是请求-响应的消息传递模式,请求者为接收每个响应消息创建一个临时队列。为了避免为每个响应消息创建一个Amazon SQS队列,临时队列客户端可以让你创建和删除多个临时队列,而无需进行任何Amazon SQS API调用。欲了解更多信息,请参阅实现请求-响应系统。
下图显示了一个使用这种模式的常见配置。
场景示例。处理一个登录请求
下面的例子场景显示了如何使用AmazonSQSRequester和AmazonSQSResponder接口来处理用户的登录请求。
在客户端
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.返回响应。
在服务器端
下面的例子假设在构建时,创建了一个线程来轮询队列,并为每个消息调用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)); }
}
清理队列
为了确保Amazon SQS回收虚拟队列所使用的任何内存资源,当你的应用程序不再需要临时队列客户端时,它应该调用shutdown()方法。你也可以使用AmazonSQSRequester接口的shutdown()方法。
临时队列客户端还提供了一种方法来消除无主的主机队列。对于在一段时间内(默认为五分钟)收到API调用的每个队列,客户端使用TagQueue API动作来标记一个仍在使用的队列。
后台线程使用ListQueues和ListTags API动作来检查所有带有配置的前缀的队列,删除任何至少5分钟内没有被标记的队列。通过这种方式,如果一个客户端没有干净地关闭,其他活动的客户端会在它之后进行清理。为了减少工作的重复,所有具有相同前缀的客户端通过一个共享的、以前缀命名的内部工作队列进行通信。
这篇关于aws SQS临时队列的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!