1. 什么是MQ
MQ(Message Queue) 消息队列,本质上是一个队列,即满足先进先出原则,它就像是一个容器,容器中保存的是需要被传递的数据(消息)。
MQ就相当于一个大的缓冲区,将数据临时存放到这个缓冲区中,当有应用程序需要使用这些数据的时候,就将自己注册到MQ上,这样MQ就会将数据发送给这些应用程序了。
MQ整体处理逻辑
- 生产者:产生数据的程序,并把产生的数据发送到指定的消息队列。
- 消息队列:暂存数据的缓冲区,并把数据按照顺序发送到数据的使用者(消费者)。
- 消费者:监听指定队列,将队列中的数据取出来,之后处理取出的数据。
2. MQ的使用场景
因为上面说过,MQ相当于一个大的缓冲区,所以就会缓解程序之间调用的紧密性,给程序之间一个喘息的机会,也就是所谓的解耦,根据这个逻辑,下面介绍MQ的使用场景。
流量消峰
假设,我们新开发了一个论坛的单应用程序,论坛刚开始的时候,活跃度只有100次的并发用户访问,随着时间的推移和用户对于论坛的认可,论坛的用户开始变多,访问量开始变成500次并发了,这样按照原来的设计,论坛是无法处理500次并发的,性能问题开始暴露出来,用户使用开始变慢,或者无法访问。该如何解决呢?
解决方案:
1. 保持系统单应用架构不变,控制并发流量,你当然不能控制用户访问,所以只能是在应用中加一个可以控制并发量的中间件帮忙解决问题。虽然这种解决方案只能暂时有效,但总比现在的用户体验要好的多。
2. 改变系统部署的整体架构,将单应用部署改成分布式部署,这一定是一个最终的好的解决方案,但是这种解决方案要复杂的多。
当我们需要更快的解决此时的性能问题,所以我们选择第一种解决方案,也就是将并行请求变成串行请求。
我们只要选择一个合适的中间件,这里选择MQ,在用户的请求与程序之间添加一个MQ,所有的请求都发送到MQ中,我们再将MQ设置一个流量控制,不要同时将500个请求发送要后台处理程序,而是设置一个规则,将500个请求分批次发送到处理程序,MQ发送到处理程序的并发量控制在100一下,只要分发规则设置的合理,也会短时间内处理请求的,用户体验是无感知变化的。
应用解耦
所谓应用解耦就是将原来的串行应用,改成并行应用。
假设:有一个订单系统,系统中有订单管理、库存管理、物流管理三个模块协同完成下单操作,它们是串联的,当库存管理模块出现问题的时候,导致后续的操作无法进行,所以导致用户下单失败,这样用户的体验是很差的,其实三个模块之间的操作是可以分开处理的,就是并行操作的,这样我们就可以引入一个MQ消息中间件来帮助我们将它们分开,就是在用户下单之后,将下单信息首先放入到MQ中,再由MQ将订单信息分发给三个模块,让三个模块分别处理订单信息,这样即使有一个模块出现了问题,也不会影响用户的下单操作。
异步处理
有些应用之间的相互调用是异步的,也就是不是实时处理的,所以使用消息中间件会让应用之间的调用耦合度降低,变得更优雅,整体架构更健壮。
假设:有两个应用程序 A和B。A调用B,但是B的处理速度很慢,而A还需要B将处理结果给到A,以便A将处理状态写入数据库中,按照原来的处理方式,B需要提供一个查询的API,A定时轮询B的数据,这样速度很慢。或者A给B提供一个回调函数,当B处理完之后,调用A提供的回调函数,将处理结果返回给A,这两种处理方式都比较麻烦,而且耦合程度有点高。当我们引入消息中间件(MQ)之后,处理的方式就会变得很优雅。
在A与B之间加一个MQ,A将数据发送到B之后,就不在与B进行交互了,A只是将自己注册到MQ当中,B处理完数据之后,将处理结果发送到MQ当中,MQ会将消息发送给A,A在进行自己的内部操作。
3. MQ 选型
流行的消息中间件
- ActiveMQ
- RabbitMQ
- Kafka
- RocketMQ
由于业务需求,最适合我的是RabbitMQ,而且RabbitMQ的功能还强大,无变成语言的依赖等等有点,所以最终选择RabbitMQ。
对于其它几种MQ的对比,大家可以自行查阅,网上很多,这里就不例举了。
鸣谢
遇见狂神说:遇见狂神说的个人空间_哔哩哔哩_Bilibili
但是我还是建议大家理解完本系列的第二节,再去看二位老师的视频,会让你更好的理解课堂讲解。