1. 消息队列MQ的简介
MQ全称 Message Queue(消息队列),是在消息传输的过程中保存消息的容器。多用于分布式系统之间进行通信
1.2 分布式系统的通信方式
-
远程直接调用:
-
通过中间件进行操作
1.3. 使用消息中间件的优劣势
1.3.1 优势
应用解耦:提高系统的容错性和扩展性
- 直接调用方式
- 使用中间件的方式
异步提速:提高用户体验和系统吞吐量 - 使用远程调用方式
- 使用中间件
削峰填谷:提高系统的稳定性
使用消息中间件可以控制访问B、C、D系统的访问量,防止高峰期造成瘫痪,但同时在高峰期过后的一段时间内,B、C、D系统仍然会进行工作。也就是:高峰期没那么高,的那会持续一段时间
1.3.2 劣势
一个东西有优势,那么必然就有它的劣势。来看一下消息中间件的劣势吧!
- 系统复杂度提高
消息中间件的加入大大增加了系统的复杂度,以前系统间的调用是同步的,现在通过MQ进行异步调用,需要保证消息的顺序性,需要处理消息丢失的情况,还要保证消息不被重复使用。而且还要对消息中间件进行维护 - 一致性问题
A 系统要完成业务,需要通过MQ给B、C、D三个系统发送消息数据,如果B、C系统处理成功,D系统处理失败,这时候还要考虑数据处理的一致性问题 - 可用性降低
一个系统对外部的依赖越多,系统的稳定性越差,一旦MQ宕机,那么业务必然收到影响。
如何决定使用还是不使用消息中间件呢?
- 生产者不需要从消费者那边获得反馈,这才可以进行异步操作。
- 用了消息中间件的收益要明显大于没使用的情况,收益还要超过管理这些MQ的成本
1.4 RabbitMQ原理图
说明:
producer: 生产者,也就是给消息中间件发消息的程序
Connection: 连接对象
Channel: 通道(信道),通过信道与消息中间件进行连接
Broker:消息中间件所在的服务器
Virtual Host: 虚拟主机,消息队列与交换机都存在这里
Exchange:交换机,负责Producer与Queue的通信
Queue:消息队列
Consumer: 消费者,也就是需要被调用的程序,消息的目标对象