RabbitMQ(一)-----MQ基础知识点

0. MQ的基本概念

  1. MQ是消息队列(Message Queue),是存储消息的中间件,在消息的传输过程中保存消息的容器,多用于分布式系统之间进行通信
  2. 分布式系统的通信方式有直接通信间接通信。如下图:
    在这里插入图片描述

直接调用:是指系统A直接根据ip:port 将消息传给系统B。
间接调用:是指系统A先把消息交给MQ中间件,再由MQ中间件把消息发送到系统B。

1. 为什么要使用MQ呢?(优势有哪些)

MQ主要提供三大方面好处:应用解耦,异步提速,削峰填谷。

1. 应用解耦

使用MQ使得应用间解耦,提高容错性,与可维护性。

在这里插入图片描述

  1. 目前有个订单系统,在使用过程中,直接调用远程其他系统,与其他系统耦合在一起,具体流程:用户下订单–>订单系统–>库存系统–>支付系统–>物流系统–>成功,返回结果。

    // 订单系统 业务代码
    try{
    	//1. 先访问库存系统
    	//2. 之后访问支付系统
    	//3. 最后访问物流系统
    } catch(Exception e){
    	// 错误
    }
    
    
  2. 这种方式应该是我们大部分人的写法,确实可以完成业务需求,但是如果当访问库存系统时出现了bug,则后面的都无法走通,即订单系统直接出现错误。====>系统容错性低

  3. 再如果老板说要加个X系统,那么我们需要在订单系统的业务代码中添加相关调用代码,一个还好,如果有十个呢,维护起来也很麻烦====>可维护性低

    在这里插入图片描述

  4. 当我们使用间接调用方式时,订单系统就跟其他系统进行解耦了,因为订单系统只需要把订单信息发送给MQ中间件即可,不必跟其他系统打交道了,而MQ则将收到的信息,转发给其他系统。====>应用解耦

  5. 当订单系统下单之后,将下单信息交给MQ之后,它就可以去休息了,然后再由MQ将下单信息交给其他系统,若在提交给库存系统的时候,出现了bug,但支付系统,跟物流系统仍然可以从MQ收到消息,继续工作,而当库存系统修复好bug的时候,可以重新从MQ中获取消息,继续工作。====>容错性提高

  6. 当老板要添加多一个X系统的时候,不必在订单系统上修改代码了,因为解耦了,反正获取到的信息都是由MQ发送。====>可维护性提高。

2. 异步提速

提高用户体验与系统吞吐量(单位时间内处理请求数目)
在这里插入图片描述

  1. 根据上图,我们得知,当用户下单时,系统所花费时间 = 库存系统响应时间 + 支付系统时间 + 物流系统时间 + 更新数据库时间 = 920ms。因为此时是同步调用。

在这里插入图片描述

  1. 根据上图,我们得知,当用户下单时,系统所花费时间 = 订单系统将消息交给MQ + 更新数据库时间 = 25ms,对比上面的时间,确实提高很多。
  2. 因为此时使用的是异步调用,当订单系统将消息交给MQ就可以不需要 理后面的系统所花费时间了,可以直接去更新数据库返回了。
  3. 此时就会有人问,如果用户下单之后,以最快速度(赶在物流系统响应之前)查看物流,而此时物流系统还没有响应好,是的,如果以极限思想考虑确实是这样子,确实会出现数据不一致情况,使用MQ也得容许短暂的不一致性,再说了,毕竟这种极限思想很难达到嘛,而且它响应的时间是比原来的方式快了数倍,极大提高用户体验,利>弊。

3. 削峰填谷

提高系统的稳定性。
在这里插入图片描述

  1. 当A系统每秒最大处理1000请求的时候,双十一突然请求瞬间增加,每秒到5000个请求,那么A系统毫无疑问直接炸了。

在这里插入图片描述
2. 使用MQ的话,可以将5000个请求同时积压在MQ上,然后让A系统每秒从MQ中拉取1000个请求即可(MQ可以实现一次性发送多少消息的消息限制),这样子A系统保住了,可以正常工作====>提高系统的稳定性
3. 削峰填谷的意思:
在这里插入图片描述
一开始的并发量,即请求很多,从而导出前面出现峰值。使用了MQ之后,控制了请求的流量,每次都取1000请求,将最开始的峰值 平均到后面的时间上,从而 “填谷"。

2. MQ的缺点

1. 系统的可用性降低

在这里插入图片描述

  1. 原来直接通信方式的时候,只需要保证A系统与B系统可以正常使用就行了。
  2. 但是使用MQ之后,如何保证MQ的正常使用呢?MQ挂了,那岂不是整个系统都炸了。

2. 系统的复杂度提高

  1. 以前的直接通信方式的时候,是使用同步的远程调用。
  2. 但是使用MQ之后,是异步调用,如何保证A发送的消息,系统B可以收得到,如何保证系统B不会收到重复的消息,如何保证消息的顺序性呢等等

3. 消息的一致性问题

  1. 当MQ给系统B、C、D发送消息的时候,B、C系统调用成功,而D系统出现bug之后,之后如何保证D系统最终会消费到刚刚的消息呢。

3. 什么情况可以使用MQ

  1. 当生产者不需要从消费者获得反馈信息就可以继续往下走,因为MQ是异步的。
  2. 容许短暂的不一致性问题,异步必然导致不一致。
  3. 要求引入MQ的好处大于坏处。

4. MQ的产品

在这里插入图片描述

其他文章

RabbitMQ(一)-----MQ基础知识点

RabbitMQ(二)-----rabbitMq基础知识与工作模式(代码演示)

RabbitMQ(三)-----非常详细Springboot整合步骤

RabbitMQ(四)-----高级应用(消息可靠性投递,消费端限流,TTL,死信队列,延迟队列)

持续更新中

RabbitMQ(五)-----集群搭建

持续更新中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值