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分钟内没有被标记的队列。通过这种方式,如果一个客户端没有干净地关闭,其他活动的客户端会在它之后进行清理。为了减少工作的重复,所有具有相同前缀的客户端通过一个共享的、以前缀命名的内部工作队列进行通信。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AWS SQS(Amazon Simple Queue Service)是亚马逊提供的一项分布式消息队列服务,用于在应用程序之间进行可靠、可伸缩的消息传递。Python是一种流行的编程语言,有丰富的库和框架支持。 使用Python操作AWS SQS可以通过Boto3库来实现。Boto3是亚马逊提供的AWS SDK for Python,可以使开发者更方便地与AWS服务进行交互。 首先,我们需要安装Boto3库,可以通过pip命令进行安装。 ``` $ pip install boto3 ``` 接下来,我们可以创建一个SQS客户端,通过提供访问密钥和密码等安全凭证来连接到AWS。 ```python import boto3 # 创建SQS客户端 sqs = boto3.client('sqs',region_name='us-west-2', aws_access_key_id='your_access_key', aws_secret_access_key='your_secret_key') ``` 现在,我们可以使用SQS客户端来发送消息到队列中。 ```python # 发送消息 response = sqs.send_message( QueueUrl='your_queue_url', MessageBody='Hello, AWS SQS' ) # 打印响应中的消息ID print(response['MessageId']) ``` 另外,我们也可以从队列中接收消息。 ```python # 接收消息 response = sqs.receive_message( QueueUrl='your_queue_url', MaxNumberOfMessages=1, VisibilityTimeout=10, WaitTimeSeconds=0 ) # 获取消息内容 message = response['Messages'][0] print(message['Body']) # 删除已接收的消息 sqs.delete_message( QueueUrl='your_queue_url', ReceiptHandle=message['ReceiptHandle'] ) ``` 以上是使用Python操作AWS SQS的简单示例。通过Boto3库,我们可以轻松地使用Python发送和接收消息,实现分布式应用程序之间的可靠消息传递。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值