aws SQS临时队列

2023-12-21 04:38
文章标签 队列 临时 aws sqs

本文主要是介绍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临时队列的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/518670

相关文章

hdu1180(广搜+优先队列)

此题要求最少到达目标点T的最短时间,所以我选择了广度优先搜索,并且要用到优先队列。 另外此题注意点较多,比如说可以在某个点停留,我wa了好多两次,就是因为忽略了这一点,然后参考了大神的思想,然后经过反复修改才AC的 这是我的代码 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<

高效+灵活,万博智云全球发布AWS无代理跨云容灾方案!

摘要 近日,万博智云推出了基于AWS的无代理跨云容灾解决方案,并与拉丁美洲,中东,亚洲的合作伙伴面向全球开展了联合发布。这一方案以AWS应用环境为基础,将HyperBDR平台的高效、灵活和成本效益优势与无代理功能相结合,为全球企业带来实现了更便捷、经济的数据保护。 一、全球联合发布 9月2日,万博智云CEO Michael Wong在线上平台发布AWS无代理跨云容灾解决方案的阐述视频,介绍了

poj 3190 优先队列+贪心

题意: 有n头牛,分别给他们挤奶的时间。 然后每头牛挤奶的时候都要在一个stall里面,并且每个stall每次只能占用一头牛。 问最少需要多少个stall,并输出每头牛所在的stall。 e.g 样例: INPUT: 51 102 43 65 84 7 OUTPUT: 412324 HINT: Explanation of the s

poj 2431 poj 3253 优先队列的运用

poj 2431: 题意: 一条路起点为0, 终点为l。 卡车初始时在0点,并且有p升油,假设油箱无限大。 给n个加油站,每个加油站距离终点 l 距离为 x[i],可以加的油量为fuel[i]。 问最少加几次油可以到达终点,若不能到达,输出-1。 解析: 《挑战程序设计竞赛》: “在卡车开往终点的途中,只有在加油站才可以加油。但是,如果认为“在到达加油站i时,就获得了一

poj3750约瑟夫环,循环队列

Description 有N个小孩围成一圈,给他们从1开始依次编号,现指定从第W个开始报数,报到第S个时,该小孩出列,然后从下一个小孩开始报数,仍是报到S个出列,如此重复下去,直到所有的小孩都出列(总人数不足S个时将循环报数),求小孩出列的顺序。 Input 第一行输入小孩的人数N(N<=64) 接下来每行输入一个小孩的名字(人名不超过15个字符) 最后一行输入W,S (W < N),用

POJ2010 贪心优先队列

c头牛,需要选n头(奇数);学校总共有f的资金, 每头牛分数score和学费cost,问合法招生方案中,中间分数(即排名第(n+1)/2)最高的是多少。 n头牛按照先score后cost从小到大排序; 枚举中间score的牛,  预处理左边与右边的最小花费和。 预处理直接优先队列贪心 public class Main {public static voi

Java并发编程之——BlockingQueue(队列)

一、什么是BlockingQueue BlockingQueue即阻塞队列,从阻塞这个词可以看出,在某些情况下对阻塞队列的访问可能会造成阻塞。被阻塞的情况主要有如下两种: 1. 当队列满了的时候进行入队列操作2. 当队列空了的时候进行出队列操作123 因此,当一个线程试图对一个已经满了的队列进行入队列操作时,它将会被阻塞,除非有另一个线程做了出队列操作;同样,当一个线程试图对一个空

FreeRTOS学习笔记(六)队列

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、队列的基本内容1.1 队列的引入1.2 FreeRTOS 队列的功能与作用1.3 队列的结构体1.4 队列的使用流程 二、相关API详解2.1 xQueueCreate2.2 xQueueSend2.3 xQueueReceive2.4 xQueueSendFromISR2.5 xQueueRecei

多线程篇(阻塞队列- LinkedBlockingDeque)(持续更新迭代)

目录 一、LinkedBlockingDeque是什么 二、核心属性详解 三、核心方法详解 addFirst(E e) offerFirst(E e) putFirst(E e) removeFirst() pollFirst() takeFirst() 其他 四、总结 一、LinkedBlockingDeque是什么 首先queue是一种数据结构,一个集合中

Java消息队列:RabbitMQ与Kafka的集成与应用

Java消息队列:RabbitMQ与Kafka的集成与应用 大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿! 在现代的分布式系统中,消息队列是实现系统间通信、解耦和提高可扩展性的重要组件。RabbitMQ和Kafka是两个广泛使用的消息队列系统,它们各有特点和优势。本文将介绍如何在Java应用中集成RabbitMQ和Kafka,并展示它们的应用场景。 消息队