消息队列

消息队列(Message Queue)简称MQ

消息队列是采用“异步(两个微服务并不需要同时完成请求)”的方式来传递数据完成业务操作流程的业务处理方式

为什么要使用消息队列

微服务项目普通存在远程调用的关系,这些操作时同步的

这里的“同步”指:消费者A调用生产者B之后,A的线程会进入阻塞状态,等待生产者B运行结束返回之后,A才能运行之后的代码

Dubbo消费者发送调用后进入阻塞状态,这个状态表示该线程仍占用内存资源,但是什么动作都不做,如果生产者运行耗时比较久,消费者就会一直等待,如果消费者利用这个时间可以处理更多请求,业务整体效率会提升。

实际情况下,Dubbo有些必要的返回值必须等待,但是不必要等待的服务返回值,我们可以不等待去做别的事情,这种情况下我们就要使用消息队列

消息队列的经典使用场景

异步调用

image-20230218113405252

服务解耦

image-20230218113824118

流量削峰(削峰填谷)

image-20230218114321731
延迟处理时间

面试题

消息队列的特征(作用)

  • 利用异步的特性,提供服务器的运行效率,减少因为远程调用出现的线程等待\阻塞
  • 削峰填谷:在并发峰值超过当前系统处理能力时,我们将没处理的信息保存到消息队列中,在后面出现的比较空闲的时间中去处理,直到所有数据一次处理完成,能够放置在并发高峰值短时间大量请求而导致的系统不稳定
  • 消息队列的延时:因为是异步执行,请求的发起者并不知道消息何时能处理完成,如果业务不能接受这种延迟,就不要使用消息队列

消息队列异常处理

问:消息队列运行时发生异常,没有完成业务,怎么通知消息的发送者,完成数据的回滚?

当消息队列中发生异常时,在异常处理的代码中,我们可以向消息的发送者发送消息,然后通知发送者处理。消息的发送者接收到消息后,一般要手写代码回滚,如果回滚代码过程中再发送异常,可以将这信息直接给“死信队列”

死信队列没有任何处理者,通常情况下会有专人周期性的处理死信队列的消息

常见消息队列软件

  • kafka:性能好\功能弱,适合大数据量,高并发的情况,大数据临湖使用较多
  • RabbitMQ:功能强\性能一般,适合发送业务需求复杂的消息队列,java业务中使用较多
  • RocketMQ:阿里的
  • ActiveMQ:前几年流行的,老项目可能用到