一. MQ介绍
1.1 MQ简介
MQ全称为Message Queue,消息队列是应用程序和应用程序之间的通信方法。
> MQ(Message Queue)消息队列,是一种用来保存消息数据的队列
> ◆ 队列:数据结构的一种,特征为 “先进先出”.
什么是消息:
◆ 微服务架构:
> 服务器A向服务器B发送要执行的操作(视为消息)
> 服务器A向服务器C发送要执行的操作(视为消息)
1.2 MQ的作用:
在项目中,可将一些无需即时返回且耗时的操作提取出来,进行异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量。
MQ应用场景
-
任务异步处理
-
应用程序解耦
-
削峰填谷
1.3 MQ的优势
1.3.1 任务异步处理
一个下单操作耗时:20 + 300 + 300 + 300 = 920ms
用户点击完下单按钮后,需要等待920ms才能得到下单响应,太慢!处理速度慢, 积压在系统的请求就更多 , 占用的系统资源就越多 , 系统的吞吐量就越低
可以使用MQ提升系统的处理速度 , 提供用户体验, 提升系统的吞吐量
用户点击完下单按钮后,只需等待25ms就能得到下单响应 (20 + 5 = 25ms)。
提升用户体验和系统吞吐量(单位时间内处理请求的数目)
1.3.2 应用程序解耦
假如我们完成下单的过程中 , 库存系统服务发生了问题, 调用失败, 那么用户下单操作也就失败了
系统的耦合性越高,容错性就越低,可维护性就越低。
可以使用MQ降低系统模块之间的耦合
使用 MQ 使得应用间解耦 , 当其他子系统发生问题之后, 并不会影响核心功能的执行 , 提升容错性和可维护性。
1.3.3 削峰填谷
假设平常时段我们的系统每秒最多可以处理1000个用户请求 , 但是某一时刻请求瞬间增多, 每秒有5000甚至10000个请求访问系统, 这个时候服务器承载不了就会导致服务器崩溃
使用MQ可以帮助我们规避这种风险
使用了 MQ 之后,限制消费消息的速度为1000,这样一来,高峰期产生的数据势必会被积压在 MQ 中,高峰就被“削”掉了,但是因为消息积压,在高峰期过后的一段时间内,消费消息的速度还是会维持在1000,直到消费完积压的消息,这就叫做“填谷”。
使用MQ后,可以提高系统稳定性
小结:
-
应用解耦:提高系统容错性和可维护性
-
异步提速:提升用户体验和系统吞吐量
-
削峰填谷:提高系统稳定性
1.4 MQ的劣势
1.4.1 系统可用性降低
系统引入的外部依赖越多,系统稳定性越差。一旦 MQ 宕机,就会对业务造成影响。如何保证MQ的高可用?
1.4.2 系统复杂度提高
MQ 的加入大大增加了系统的复杂度,以前系统间是同步的远程调用,现在是通过 MQ进行异步调用。
如何保证消息没有被重复消费?怎么处理消息丢失情况?那么保证消息传递的顺序性?
1.4.3 一致性问题
A 系统处理完业务,通过 MQ 给B、C、D三个系统发消息数据,如果 B 系统、C 系统处理成功,D 系统处理失败。如何保证消息数据处理的一致性?
小结:
1.5 常用的MQ产品介绍:
目前业界有很多的 MQ产品,例如 RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMq等,也有直接使用 Redis充当消息队列的案例,而这些消息队列产品,各有侧重,在实际选型时,需要结合自身需求及 MQ 产品特征,综合考虑。下面是常见MQ产品的对比