文章目录
0. MQ的基本概念
- MQ是消息队列(Message Queue),是存储消息的中间件,在消息的传输过程中保存消息的容器,多用于分布式系统之间进行通信。
- 分布式系统的通信方式有直接通信,间接通信。如下图:
直接调用:是指系统A直接根据ip:port 将消息传给系统B。
间接调用:是指系统A先把消息交给MQ中间件,再由MQ中间件把消息发送到系统B。
1. 为什么要使用MQ呢?(优势有哪些)
MQ主要提供三大方面好处:应用解耦,异步提速,削峰填谷。
1. 应用解耦
使用MQ使得应用间解耦,提高容错性,与可维护性。
-
目前有个订单系统,在使用过程中,直接调用远程其他系统,与其他系统耦合在一起,具体流程:用户下订单–>订单系统–>库存系统–>支付系统–>物流系统–>成功,返回结果。
// 订单系统 业务代码 try{ //1. 先访问库存系统 //2. 之后访问支付系统 //3. 最后访问物流系统 } catch(Exception e){ // 错误 }
-
这种方式应该是我们大部分人的写法,确实可以完成业务需求,但是如果当访问库存系统时出现了bug,则后面的都无法走通,即订单系统直接出现错误。====>系统容错性低
-
再如果老板说要加个X系统,那么我们需要在订单系统的业务代码中添加相关调用代码,一个还好,如果有十个呢,维护起来也很麻烦====>可维护性低
-
当我们使用间接调用方式时,订单系统就跟其他系统进行解耦了,因为订单系统只需要把订单信息发送给MQ中间件即可,不必跟其他系统打交道了,而MQ则将收到的信息,转发给其他系统。====>应用解耦
-
当订单系统下单之后,将下单信息交给MQ之后,它就可以去休息了,然后再由MQ将下单信息交给其他系统,若在提交给库存系统的时候,出现了bug,但支付系统,跟物流系统仍然可以从MQ收到消息,继续工作,而当库存系统修复好bug的时候,可以重新从MQ中获取消息,继续工作。====>容错性提高
-
当老板要添加多一个X系统的时候,不必在订单系统上修改代码了,因为解耦了,反正获取到的信息都是由MQ发送。====>可维护性提高。
2. 异步提速
提高用户体验与系统吞吐量(单位时间内处理请求数目)
- 根据上图,我们得知,当用户下单时,系统所花费时间 = 库存系统响应时间 + 支付系统时间 + 物流系统时间 + 更新数据库时间 = 920ms。因为此时是同步调用。
- 根据上图,我们得知,当用户下单时,系统所花费时间 = 订单系统将消息交给MQ + 更新数据库时间 = 25ms,对比上面的时间,确实提高很多。
- 因为此时使用的是异步调用,当订单系统将消息交给MQ就可以不需要 理后面的系统所花费时间了,可以直接去更新数据库返回了。
- 此时就会有人问,如果用户下单之后,以最快速度(赶在物流系统响应之前)查看物流,而此时物流系统还没有响应好,是的,如果以极限思想考虑确实是这样子,确实会出现数据不一致情况,使用MQ也得容许短暂的不一致性,再说了,毕竟这种极限思想很难达到嘛,而且它响应的时间是比原来的方式快了数倍,极大提高用户体验,利>弊。
3. 削峰填谷
提高系统的稳定性。
- 当A系统每秒最大处理1000请求的时候,双十一突然请求瞬间增加,每秒到5000个请求,那么A系统毫无疑问直接炸了。
2. 使用MQ的话,可以将5000个请求同时积压在MQ上,然后让A系统每秒从MQ中拉取1000个请求即可(MQ可以实现一次性发送多少消息的消息限制),这样子A系统保住了,可以正常工作====>提高系统的稳定性。
3. 削峰填谷的意思:
一开始的并发量,即请求很多,从而导出前面出现峰值。使用了MQ之后,控制了请求的流量,每次都取1000请求,将最开始的峰值 平均到后面的时间上,从而 “填谷"。
2. MQ的缺点
1. 系统的可用性降低
- 原来直接通信方式的时候,只需要保证A系统与B系统可以正常使用就行了。
- 但是使用MQ之后,如何保证MQ的正常使用呢?MQ挂了,那岂不是整个系统都炸了。
2. 系统的复杂度提高
- 以前的直接通信方式的时候,是使用同步的远程调用。
- 但是使用MQ之后,是异步调用,如何保证A发送的消息,系统B可以收得到,如何保证系统B不会收到重复的消息,如何保证消息的顺序性呢等等
3. 消息的一致性问题
- 当MQ给系统B、C、D发送消息的时候,B、C系统调用成功,而D系统出现bug之后,之后如何保证D系统最终会消费到刚刚的消息呢。
3. 什么情况可以使用MQ
- 当生产者不需要从消费者获得反馈信息就可以继续往下走,因为MQ是异步的。
- 容许短暂的不一致性问题,异步必然导致不一致。
- 要求引入MQ的好处大于坏处。
4. MQ的产品
其他文章
RabbitMQ(一)-----MQ基础知识点
RabbitMQ(二)-----rabbitMq基础知识与工作模式(代码演示)
RabbitMQ(三)-----非常详细Springboot整合步骤
RabbitMQ(四)-----高级应用(消息可靠性投递,消费端限流,TTL,死信队列,延迟队列)
持续更新中
RabbitMQ(五)-----集群搭建
持续更新中