MQ是什么

MQ全称为Message Queue,即消息队列。

消息队列技术是分布式应用间交换信息的一种技术。

消息队列可驻留在内存或磁盘上,队列存储消息直到它们被应用程序读走。

通过消息队列,应用程序可独立的执行,它们不需要知道彼此的位置、或在继续执行前不需要等待接收程序接收此消息。

MQ主要作用是接收和转发消息。你可以想想在生活中的一种场景:当你把信件投进邮筒,邮递员肯定最终会将信件送给收件人。我们可以把MQ比作邮局和邮递员。

MQ和邮局的主要区别是:它不处理消息。但是,它会接受数据、存储消息数据、转发消息。

FIFO先入先出。

消息队列包括两种模式,点对点模式(point to point, queue)和发布/订阅模式(publish/subscribe,topic)。

应用场景

异步处理

场景说明:用户注册后,需要发注册邮件和注册短信。

传统的做法有两种方式:

  1. 串行方式:将注册信息写入数据库后,发送注册邮件,再发送注册短信,以上三个任务全部完成后才返回给客户端。 这有一个问题是,邮件,短信并不是必须的,它只是一个通知,而这种做法让客户端等待没有必要等待的东西。
  2. 并行方式:将注册信息写入数据库后,发送邮件的同时,发送短信,以上三个任务完成后,返回给客户端,并行的方式能提高处理的时间。

    假设三个业务节点分别使用50ms,串行方式使用时间150ms,并行使用时间100ms。虽然并性已经提高的处理时。但是,前面说过,邮件和短信对我正常的使用网站没有任何影响,客户端没有必要等着其发送完成才显示注册成功,应该是写入数据库后就返回。
  • 消息队列:引入消息队列后,把发送邮件,短信不是必须的业务逻辑异步处理。

    由此可以看出:引入消息队列后,用户的响应时间就等于写入数据库的时间+写入消息队列的时间(可以忽略不计),引入消息队列处理后,响应时间是串行的3倍,是并行的2倍。
应用解耦

场景说明:双11是购物狂节,用户下单后,订单系统需要通知库存系统。传统的做法就是订单系统调用库存系统的接口。

thingboard 默认消息队列 消息队列模式_thingboard 默认消息队列


这种做法有以下缺点:

  • 当库存系统出现故障时,订单就会失败。就会损失好多好多钱
  • 订单系统和库存系统高耦合

引入消息队列 :

thingboard 默认消息队列 消息队列模式_数据库_02

  • 订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功。
  • 库存系统:订阅下单的消息,获取下单消息,进行库操作。
  • 就算库存系统出现故障,消息队列也能保证消息的可靠投递,不会导致消息丢失。(这样就可以保证了不丢失订单)
流量削峰

流量削峰一般在秒杀活动中应用广泛 。
场景说明:秒杀活动,一般会因为流量过大,导致应用挂掉,为了解决这个问题,一般在应用前端加入消息队列。

作用:

  1. 可以控制活动人数,超过此一定阀值的订单直接丢弃。
  2. 可以缓解短时间的高流量压垮应用。(应用程序按自己的最大处理能力获取订单)

thingboard 默认消息队列 消息队列模式_thingboard 默认消息队列_03


用户的请求,服务器收到之后,首先写入消息队列,加入消息队列,长度超过最大值,则直接抛弃用户请求或跳转到错误页面.。

秒杀业务根据消息队列中的请求信息,再做后续处理。