activemq消息队列是什么
- 行业动态
- 2025-02-15
- 3091
ActiveMQ 是一种流行且功能强大的开源消息队列系统,在分布式系统的通信和集成中发挥着重要作用,以下是关于 ActiveMQ 的详细介绍:
1、基本概念
消息队列:消息队列(Message queue)是在消息的传输过程中保存消息的容器,消息队列管理器在将消息从它的源中继到它的目标时充当中间人,队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功地传递它。
ActiveMQ:ActiveMQ 是 Apache 软件基金会的一个项目,它是基于 Java 的开源消息队列系统,支持多种协议和消息模型,如 JMS、STOMP、AMQP 等,它可以运行在多种平台上,如 Linux、Windows、Mac OS X 等,并支持多种集群模式,如单机、集群、分布式等。
2、核心组件
Producer(生产者):负责将消息发送到 ActiveMQ 队列或主题。
Consumer(消费者):订阅 ActiveMQ 队列或主题并接收消息。
Queue(队列):一种点对点的消息传递模式,消息被发送到一个队列,只有一个 Consumer 可以接收并处理该消息。
Topic(主题):一种发布 订阅的消息传递模式,消息被发送到一个主题,多个 Consumer 可以订阅并接收该消息。
Broker(代理服务器):ActiveMQ 的消息代理服务器,负责接收、存储和分发消息。
3、主要特性
JMS 兼容:实现了 JMS(Java Message Service)规范,使得开发者可以使用 JMS API 来进行消息的发送和接收。
持久性:支持消息的持久性传递,即使在消息发送后,也能确保消息不会丢失。
事务支持:支持事务,可以确保消息的可靠传递和处理,即使在发生故障时也不会丢失消息。
灵活的消息选择器:提供了消息选择器机制,可以根据消息属性选择特定的消息进行消费。
多种编程语言支持:除了 Java,还支持多种编程语言,如 C、C++、Python、.NET 等。
高可用性:支持多节点部署,可以实现高可用的消息传递,保证系统的稳定性。
4、应用场景
异步通信:系统 A 做的是主要的业务,而系统 B、C、D 是非主要的业务,比如系统 A 处理的是订单下单,而系统 B 是订单下单成功了,那发送一条短信告诉具体的用户此订单已成功,而系统 C 和系统 D 也是处理一些小事而已,那么此时,为了提高用户体验和吞吐量,其实可以异步地调用系统 B、C、D 的接口。
解耦:假设我们有一个用户系统 A,用户系统 A 可以产生一个 userId,现在有系统 B 和系统 C 都需要这个 userId 去做相关的操作,某一天,系统 B 的负责人告诉系统 A 的负责人,现在系统 B 的 SystemBNeed2do(String userId) 这个接口不再使用了,让系统 A 别去调它了,系统 A 的负责人说 “好的,那我就不调用你了。”,于是就把调用系统 B 接口的代码给删掉了,代码变成这样了,由于业务需要,系统 D 说也需要用到系统 A 的 userId,于是代码改成了这样,当前系统 A、B、C、D 系统的交互是这样子的,系统交互随着业务需求的变化,代码也要一遍一遍的修改,还会存在另外一个问题,调用系统 C 的时候,如果系统 C 挂了,系统 A 还要想办法处理,如果调用系统 D 时,由于网络延迟,请求超时了,那系统 A 是反馈 fail 还是重试?那么怎么去解决这样的现状呢,如何从频繁的修改代码中解脱呢?这时候我们就引入一层消息队列中间件,交互图如下:解耦将系统 A 产生的 userId 写到消息队列中,系统 C 和系统 D 从消息队列中拿数据,这样有什么好处?系统 A 只负责把数据写到队列中,谁想要或不想要这个数据 (消息),系统 A 一点都不关心,即便现在系统 D 不想要 userId 这个数据了,系统 B 又突然想要 userId 这个数据了,都跟系统 A 无关,系统 A 一点代码都不用改,系统 D 拿 userId 不再经过系统 A,而是从消息队列里边拿,系统 D 即便挂了或者请求超时,都跟系统 A 无关,只跟消息队列有关,这样一来,系统 A 与系统 B、C、D 都解耦了。
削峰 / 限流:现在我们每个月要搞一次大促,大促期间的并发可能会很高的,比如每秒 3000 个请求,假设我们现在有两台机器处理请求,并且每台机器只能每次处理 1000 个请求,系统 B 和系统 C 根据自己的能够处理的请求数去消息队列中拿数据,这样即便有每秒有 8000 个请求,那只是把请求放在消息队列中,去拿消息队列的消息由系统自己去控制,这样就不会把整个系统给搞崩。
5、安装步骤
下载和安装:从 Apache ActiveMQ 的官方网站下载 ActiveMQ,然后按照官方文档进行安装和配置。
启动服务:进入 bin 目录,使用 activemq.bat(Windows)或 activemq(Linux)命令启动 ActiveMQ 服务。
访问管理界面:启动成功后,可以通过浏览器访问 http://localhost:8161/admin,默认用户名和密码均为 admin。
6、示例代码
点对点队列实例
import org.apache.activemq.ActiveMQConnectionFactory; import javax.jms.Connection; import javax.jms.Session; import javax.jms.Queue; import javax.jms.MessageProducer; import javax.jms.MessageConsumer; import javax.jms.TextMessage; public class PointToPointQueueExample { public static void main(String[] args) throws Exception { // 创建连接工厂 ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616"); // 创建连接 Connection connection = connectionFactory.createConnection(); // 启动连接 connection.start(); // 创建会话 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); // 创建队列 Queue queue = session.createQueue("queue://testQueue"); // 创建生产者 MessageProducer producer = session.createProducer(queue); // 创建消息 TextMessage message = session.createTextMessage("Hello, ActiveMQ!"); // 发送消息 producer.send(message); // 创建消费者 MessageConsumer consumer = session.createConsumer(queue); // 接收消息 TextMessage receivedMessage = (TextMessage) consumer.receive(); // 打印消息 System.out.println("Received: " + receivedMessage.getText()); // 关闭会话和连接 session.close(); connection.close(); } }
发布订阅队列实例
import org.apache.activemq.ActiveMQConnectionFactory; import javax.jms.Connection; import javax.jms.Session; import javax.jms.Topic; import javax.jms.MessageProducer; import javax.jms.MessageConsumer; import javax.jms.TextMessage; public class PublishSubscribeQueueExample { public static void main(String[] args) throws Exception { // 创建连接工厂 ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616"); // 创建连接 Connection connection = connectionFactory.createConnection(); // 启动连接 connection.start(); // 创建会话 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); // 创建主题 Topic topic = session.createTopic("topic://testTopic"); // 创建生产者 MessageProducer producer = session.createProducer(topic); // 创建消息 TextMessage message = session.createTextMessage("Hello, ActiveMQ!"); // 发送消息 producer.send(message); // 创建消费者 MessageConsumer consumer = session.createConsumer(topic); // 接收消息 TextMessage receivedMessage = (TextMessage) consumer.receive(); // 打印消息 System.out.println("Received: " + receivedMessage.getText()); // 关闭会话和连接 session.close(); connection.close(); } }
7、常见问题及解答
Q:ActiveMQ 中的队列和主题有什么区别?
A:队列是一种先进先出的数据结构,用于点对点的消息传递模式,即一个消息生产者发送的消息只能被一个消息消费者接收和处理,而主题则是一种发布 订阅模式的消息传递方式,一个消息生产者发送的消息可以被多个消息消费者订阅和接收。
Q:如何在 ActiveMQ 中实现消息的持久化?
A:ActiveMQ 本身支持消息的持久化传递,只需要在配置 ActiveMQ 时开启持久化功能即可,还可以通过配置持久化存储的位置和方式来满足不同的需求。
8、小编有话说:ActiveMQ作为一款成熟且功能强大的开源消息队列系统,为开发者提供了丰富的功能和灵活的配置选项,无论是在企业级应用还是小型项目中,ActiveMQ都能发挥其优势,帮助开发者实现高效、可靠的消息传递和异步通信,希望本文能对您理解和使用ActiveMQ有所帮助。
本站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本站,有问题联系侵删!
本文链接:http://www.xixizhuji.com/fuzhu/82758.html