RabbitMQ笔记
MQ的本质
什么是MQ
- MQ的本质就是(一发一存一消费)
- 就是一个转发器
MQ将生产者的消息存入一个叫「队列」的容器,然后取出来,转发给消费者。包含俩个关键元素:消息、队列
消息:要转发的数据,可以是简单的字符串,也可以是约定好的格式
队列:一个先进先出的数据结构,消息从队尾入,队头出
MQ的模型
两个模型的区别就是消息是单播还是多播(一个消息是否可以被多次消费)。
- 队列模型
- 多个生产者可以向一个队列中存入信息
- 多个消费者是竞争关系
- 一个消息只能消费一次
- 订阅模型
- 发布者发布消息
- 订阅者消费消息
- 每个订阅者都可以收到全量的消息
应用场景
MQ模型实际解决的是生产者和消费者的通信问题。之前是消费者直接调用生产者。
引入MQ之后,关键的区别在于:
1、之前是一次RPC,现在是两次RPC调用。
2、多出来一个中间节点「队列」存储消息,由同步变成异步
之前一个完整的业务流程包括多个流程,比如「人员入职的审批」,包含「记录入职信息」、「入司文件归档」、「发送审批结果给用户」、「同步核心系统」。
- 优点
- 系统解耦
- 引入MQ之后,现在「审批」可以只关注最主要的「记录入职信息」,其他事情全部交给MQ来通知即可。
- 异步通信
- 引入MQ之后,「入司文件归档」、「发送审批结果给用户」、「同步核心系统」都变成来异步执行,减少了「人员入职的审批」整体耗时。
- 流量削峰
- 引入MQ之后,MQ可以转储消息,可以吧MQ当作漏斗,进行限流。
- 系统解耦
- 缺点
- 系统可用性降低
- 系统复杂度升高
- 数据一致性问题
常见问题
- 重复消费
- 保证幂等性
- 数据库主键
- insert之前先select,如果存在就update
- 使用redis,set覆盖,天然幂等
- 保证幂等性
- 消息丢失
- 生产端丢失
- 开启事务(同步,提交事务之后会阻塞)
- confirm机制(异步,MQ接收后回调通知)
- MQ丢失
- 开启持久化
- 队列持久化
- 消息持久化
- 开启持久化
- 消费者丢失
- ack
- 生产端丢失
- 积压、过期失效、堆积
- 临时部署多个消费者消费
- 手动补
- 丢弃,手动补
- 如何保证顺序性
- 一个「队列」,多个「消费者」导致的乱序
- 拆分队列,一个「队列」一个「消费者」
- 一个「队列」,多个「消费者」导致的乱序
RabbitMQ实战
AMQP协议(Advanced Message Queuing Protocol)
消息通信
生产者创建消息
消费者接收消息
一个TCP链接,多个信道(channel)
交换器
队列
绑定