消息队列基础


什么是队列

队列这个概念非常好理解,你可以把它想象为在食堂排队打饭,先来的先打,后来的人只能站末尾,不允许插队,先进者先出,这就是典型的队列。
在这里插入图片描述
队列的特定就是先进先出,先来的先出去

什么是消息队列

消息

  • 消息是指在应用间传送的数据。
  • 消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象。

    消息队列

  • 消息队列是一种应用间的通信方式,说白了就是存放消息的队列
  • 消息发送后可以立即返回,由消息系统来确保消息的可靠传递。
  • 消息发布者只管把消息发布到队列中,而不用管谁来取
  • 消息使用者只管从队列中取消息而不管是谁发布的
  • 这样发布者和使用者都不用知道对方的存在
  • 常见的消息队列有 RabbitMQ、RocketMQ、Kafka
    在这里插入图片描述

    什么是 RabbitMQ ?

一场使用消息进行通信的高可用和数据安全的在线会议
这句话是RabbitMQ官网的描述

实际上,RabbitMQ 是一种消息通信方式,采用消息队列的形式,来将消息进行传递与发送,RabbitMQ 在通过消息队列传递消息时,可以保证消息的高可用性、消息中数据的安全性。

也就是说,RabbitMQ 是一种高可用且数据安全的消息通信中间件。

为什么要使用消息队列

  • 消息队列也是针对特定问题有不同的使用场景,
  • 任何技术的产生都是为了解决问题
  • 消息队列主要用于异步处理、应用解耦、流量削峰三种场景。

异步处理

我们可以想象一种场景,我们的在网站注册新用户的时候:

  • 填写注册信息后,
  • 需要发送验证码,
  • 用户收到验证码输入,要通过短信和邮件的方式验证是否用户本人注册,每个流程的请求响应耗时为 100ms,在同步的方式下总共需要耗时 300ms。

    同步场景

    在这里插入图片描述

    异步场景

  • 在异步场景下,我们不用等待邮件是否发送成功,只需写入注册信息后
  • 开启两个异步任务,调用邮件合短信服务,两个服务同时完成,
  • 最终响应只需要200ms
    在这里插入图片描述

消息队列

  • 使用消息队列后,我们直接发送注册消息后,系统直接返回,
  • 至于后面的邮件合短信服务是否进行,我们不要要管理
  • 反正他们最终一定会执行
  • 最终只需要100ms
    在这里插入图片描述

后面的邮件服务和短信服务,直接去消息队列中取消息消息后执行即可

应用解耦

上述异步请求的过程本质上也是应用解耦的过程,再模拟一个场景,用户下订单后,需要调用库存服务,如果库存服务升级,订单服务也跟着需要升级,耦合度比较高

在这里插入图片描述

引入消息队列后,只需要统一消息即可,实现高内聚,低耦合在这里插入图片描述

流量削峰

  • 互联网存在很多高并发场景,例如在 12306 抢购春运火车票,或者天猫的双十一和各类电商的秒杀秒杀活动,
  • 系统在短时间收到大量的用户请求,数据库无法处理相对日常的数倍流量
  • 数据库非常容易被压垮甚至宕机,会导致服务不可用。
  • 为了避免这种情况发生,有熔断、降级、以及流量削峰等多种解决方案,消息队列是最常见的流量削峰方案。

在这里插入图片描述

  • 业务代码从消息队列中拿到用户请求,再执行后续的业务逻辑。
  • 消息队列在用户和业务逻辑中之间作为中间件模块
  • 库存服务可以一条一条的处理消息,防止大量流量直接打到底层数据库。

Author: stream
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source stream !
  TOC