目录
前言
这是我学习RabbitMQ总结的笔记,RabbitMQ是很强大的消息队列组件,是学习java路上不可缺少的一部分,越学越觉得自己无知,继续加油,欢迎大家阅读本文!!相信阅读后大家可以对RabbitMQ有简单的认识
1.什么是RabbitMQ?

RabbitMQ是一个开源的消息代理软件(有时也被称为面向消息的中间件),它实现了高级消息队列协议(AMQP),在分布式系统中扮演着重要的角色。可以使用mq实现异步通信
2.同步调用的优缺点
-
优点:
-
时效性强,等待到结果才会返回
-
缺点:
-
可拓展性差,每次都需要修改各个模块的代码
-
性能下降
-
级联失败问题
3.异步调用的优缺点
- 异步调用通常是基于消息通知的方式,包含三个角色:
- 消息发送者:投递消息的人,就是原来的调用者
- 消息接收者:接收和处理消息的人,就是原来的服务提供者
- 消息代理:管理、暂存、转发消息,你可以把它理解成微信服务器,或者是一个中转站

- 消息发送者
- 消息代理:一般是消息队列这里使用RabitMQ 就是broker
- 消息接收者
3.1优点:
- 解除耦合,拓展性强
- 无需等待,性能好
- 故障隔离
- 缓存消息,流量削峰填谷(常见的场景就比如抖音卖货321开始抢单,只有在那一会并发量较大,需要处理的流量多,而其他时候流量却很少,这时候流量就像山峰和山谷,消息队列可以实现流量的削峰填谷,实现流量的相对平稳被服务器处理)

3.2异步调用的问题是什么?
- 不能立即得到调用结果,时效性差
- 不确定下游业务执行是否成功
- 业务安全依赖于Broker的可靠性
我们在选择消息队列的时候尽量要选择安全性可靠性高的消息队列,如果消息队列一出现问题,那么我们的消息全部丢失,这时候如果是一些支付消息,那就很糟糕了
4技术选型
市场上有许多的消息队列供我们选择,这里我们分析各个消息队列的优缺点

4.1AMQP协议就是:
AMQP(Advanced Message Queuing Protocol)协议是一个开放标准的应用层协议,专为在分布式系统中实现可靠的消息传递和异步通信而设计。它定义了一套详细的规范,涵盖了消息的创建、发布、路由、接收以及确认等各个环节,确保消息能够在不同的应用程序或系统之间准确无误地传输,并且支持多种消息传递模式,如点对点、发布/订阅等,以满足不同业务场景的需求。同时,AMQP协议还具有良好的可扩展性和互操作性,允许不同的实现之间进行无缝集成和通信。(也就是不区分编程语言)
- 消息队列就是我们进行异步调用模型的消息代理,broker
- kafka的单机吞吐量非常之高,可以达到几百万每秒,适合做一些大数据处理
- RocketMq单机吞吐量可以达到10w以上
- RabbitMQ一般在10w一下
4.2kafka和RabbitMQ的使用场景
可以看一下我之前写的csdn分析过
支持镜像集群,可用性高
5.安装RabitMq
这里使用docker安装更加方便
之前有写过docker的安装教程点我
docker run \
-e RABBITMQ_DEFAULT_USER=itheima \ 用户名
-e RABBITMQ_DEFAULT_PASS=123321 \ 密码
-v mq-plugins:/plugins \ 数据卷挂载
--name mq \ 容器名字
--hostname mq \ 主机名字
-p 15672:15672 \ 客户端端口
-p 5672:5672 \ 接受信息端口
--network hm-net\ 网络
-d \
rabbitmq:3.8-management
6.rabitmq的整体架构

这里我们就可以知道消息发送者将消息发送给交换机,然后根据交换机的不同类型,不同策略去将消息发送给我们的队列,然后再由我们的消费者去消费。
交换机有不同类型目前刚学到Fanout(广播)
7.RabibtMQ的快速入门
在学习一门技术我们一般可以先去学习如何使用,快速入门,然后根据功能逐步扩展,这里我们选择快速入门实践我们的RabbitMQ


rabitmq客户端的地址。这里是我的虚拟机地址
绑定了两个队列

发送消息

rabitMq的客户端的功能相当全面,我们可以查看我们发送的消息,而不用消费者

7.1小结:
交换机只能进行路由消息无法存储消息,如果我们没有给交换机绑定消息队列,那么我们的消息就会丢失,因此必须进行交换机绑定
8.数据隔离
我们在开发的时候往往希望不同的业务和项目再使用我们的mq服务时候,数据数据是隔离的,因此我们会采取给不同的业务 和项目赋予不同的用户 ,然后再给用户赋予不同的虚拟主机,以此来实现数据隔离
9.任务模型workqueue

**workqueue:**可以加快我们消费者消费的速度,就比如在一些高并发场景下我们可以让多个消费者去同时监听一个队列,可以解决消息堆积问题
可以简单的去模拟我们的任务模型在java当中
生产者

消费者

默认采取轮询的策略,为了实现能者多劳,我们可以修改配置,如下

workqueue任务模型
- 多个消费者绑定到一个队列,可以加快消息处理速度
- 同一条消息只会被一个消费者处理
- 通过设置prefetch来控制消费者预取的消息数量,处理完一条再处理下一条,实现能者多劳
10.Fanout交换机
交换机的作用主要是接收发送者发送的消息,并将消息路由到与其绑定的队列。
常见交换机的类型有以下三种:
- Fanout:广播
- Direct:定向
- Topic:话题
fanout交换机是广播,每一个与其绑定的queue都可以接收消息,所以也叫广播模式
可以看一下代码的简单实现。
消费者

生产者
总结
RabbitMQ 是一款开源的消息代理软件,实现了 AMQP 协议,在分布式系统异步通信中发挥关键作用。与同步调用相比,异步调用借助消息发送者、接收者和 RabbitMQ 这样的消息代理,虽然牺牲了时效性、难以确定业务执行状态且依赖代理可靠性,但具备解除耦合、提升性能、隔离故障以及流量削峰填谷等优势。在技术选型上,RabbitMQ 单机吞吐量一般在 10w 以下,相比 Kafka 的数百万每秒、RocketMQ 的 10w 以上,更适用于对可用性要求高的场景。通过 Docker 可便捷安装 RabbitMQ,其架构中交换机负责消息路由,如 Fanout 交换机采用广播模式将消息分发至所有绑定队列。使用时,交换机必须绑定队列以防止消息丢失,还可通过用户和虚拟主机实现数据隔离;workqueue 任务模型支持多消费者绑定同一队列加速消息处理,通过设置 prefetch 实现能者多劳 。