目录
RabbitMQ是什么
为什么要使用RabbitMQ
RabbitMQ的安装
RabbitMQ架构及其对应概念
队列的主要作用
交换机的主要作用
RabbitMQ的应用
通过控制面板操作(实现收发消息)
RabbitMQ是什么
RabbitMQ是一个开源的消息队列软件(消息代理),实现了高级消息队列协议(AMQP)。它允许不同应用系统之间、以及分散系统中的各个组件之间通过消息传递进行通信和数据交换,从而实现松耦合的系统设计。RabbitMQ支持多种消息协议,易于在分布式系统中使用,具有高可用性和可扩展性。
为什么要使用RabbitMQ
使用RabbitMQ在项目中,主要是为了优化系统间通信的方式,特别是在处理同步调用和异步调用时具有明显的优势。
-
提高系统的响应速度:对于一些不需要立即返回结果的操作,通过RabbitMQ实现异步调用可以显著减少用户的等待时间。例如,用户注册成功后发送欢迎邮件,这类操作可以通过消息队列异步执行,避免了同步等待导致的延迟。
-
解耦系统组件:通过消息队列,生产者(发送方)和消费者(接收方)之间实现了松耦合。这意味着它们可以独立地扩展和修改,而不会互相影响。比如订单系统与库存系统,通过RabbitMQ进行交互,即使将来库存系统的接口发生变化,只要消息格式不变,订单系统无需做任何修改。
-
增强系统的可靠性和稳定性:当使用同步调用时,如果被调用的服务不可用,则可能导致整个流程失败。而使用RabbitMQ进行异步调用,消息可以先存储在队列中,待服务恢复后再进行处理,从而提高了系统的容错能力。
-
支持负载均衡和扩展性:RabbitMQ允许同一类型的消息被多个消费者消费,这样可以根据实际需要动态增加或减少消费者来应对不同的负载情况,实现资源的有效利用。
RabbitMQ的安装
基于Docker来安装RabbitMQ,使用下面的命令即可:
docker run \
-e RABBITMQ_DEFAULT_USER=mqtest \
-e RABBITMQ_DEFAULT_PASS=123456 \
-v mq-plugins:/plugins \
--name mq \
--hostname mq \
-p 15672:15672 \
-p 5672:5672 \
-d \
rabbitmq:3.8-management
安装命令中有两个映射的端口:
15672:RabbitMQ提供的管理控制台的端口
5672:RabbitMQ的消息发送处理接口
安装完成后,启动RabbitMQ
docker start mq
docker logs -f mq
我们访问 http://192.168.12.101:15672即可看到管理控制台。(注意:填写你自己的虚拟机地址)
首次访问需要登录,默认的用户名(mqtest)和密码(123456)在配置文件中,可以修改。
登录后页面如图所示:
RabbitMQ架构及其对应概念
RabbitMQ对应的架构如图:
publisher
:生产者,也就是发送消息的一方
consumer
:消费者,也就是消费消息的一方
queue
:队列,存储消息。生产者投递的消息会暂存在消息队列中,等待消费者处理
exchange
:交换机,负责消息路由。生产者发送的消息由交换机决定投递到哪个队列。
virtual host
:虚拟主机,起到数据隔离的作用。每个虚拟主机相互独立,有各自的exchange、queue
队列的主要作用
消息存储:队列是存储消息的地方。生产者将消息发送到队列中,消费者从队列中读取消息进行处理。
保证消息顺序:在一个队列内部,消息的处理遵循先进先出(FIFO)原则,确保了消息被按照发送的顺序消费。
负载均衡:当有多个消费者订阅同一个队列时,队列可以实现负载均衡的功能,即每个消息只会被一个消费者接收并处理,从而分散工作负载。
交换机的主要作用
路由选择:交换机决定了消息应该被发送到哪些队列。它根据一定的规则(例如消息的路由键和绑定到交换机的队列的绑定键之间的匹配关系)来决定消息的去向。
直连交换机(Direct Exchange):通过精确匹配路由键将消息路由到队列。
扇形交换机(Fanout Exchange):忽略路由键,将消息广播给所有绑定到该交换机的队列。
主题交换机(Topic Exchange):允许使用通配符对路由键进行模式匹配,以更灵活的方式路由消息。
RabbitMQ的应用
通过控制面板操作(实现收发消息)
(1)我们打开Queues
选项卡,新建一个队列:填写name,然后点击Add queue.
(2)点击Exchanges
选项卡,点击amq.fanout
交换机,进入交换机详情页,然后点击Bindings
菜单,在表单中填写要绑定的队列名称,点击Bind。
(3)再次回到exchange页面,找到刚刚绑定的amq.fanout
,点击进入详情页,再次发送一条消息:
回到Queues
页面,可以发现hello.queueTest
中已经有一条消息了,点击队列名称,进入详情页,查看队列详情,这次我们点击get message,可以看到消息到达队列了。
解读:实现交换机发送信息到绑定的队列上了。