为什么使用MQ
1. 解耦
消息队列可以实现系统解耦,允许独立扩展或修改系统的各个组成部分。生产者和消费者不需要同时联机,生产者发送消息后立即返回,不依赖于消费者的处理时间,消费者可以在任何时间从消息队列中获取消息而不依赖于生产者的运行时间,二者之间实现完全的时间解耦。
2. 异步
通信消息队列可以实现系统之间的异步数据交互。生产者将消息发送到队列而不等待消费者回应,消费者在任意时间消费消息而不需要实时回应生产者,整个通信过程是异步的。
3. 削峰填谷
消息队列可以削峰填谷,在并发量剧增的情况下,也能保证系统正常运转。生产消息的速度过快而消费者来不及处理时,消息会缓存在队列中,等到消费者处理完其他消息时再消费。反之,生产速度过慢,消费者也可以从队列中不断获取消息,保证消费者的资源得到充分利用。
4. 可靠性
消息队列保证数据处理的可靠性。消息成功写入队列后,即使发生系统崩溃,消息也不会丢失,消费者可以再次启动后消费队列数据。这保证了数据最终可以被处理,提高了系统的可靠性。
5. 扩展性
消息队列在数据量剧增和并发量激增的情况下,仍能保证高性能和数据不丢失。且消费者可以动态增减,以满足增加或下降的消息处理需求。使系统具有很好的扩展性。
所以,总结来说,使用消息队列的主要目的是为了实现系统解耦,支持异步通信,提高系统可靠性与扩展性。消息队列具有削峰填谷的功能,能有效应对数据量和并发激增的情况,保证系统正常运转。
部分解析
在我们平日里无论是通过各种方式学习MQ最先看到的都是MQ的三大优点:异步、削峰、解耦。那么下面我们进行一下这三点的分析,在面试时可靠性和扩展性往往是我们提出来后去引导面试官问下面的问题。
异步
在电商系统中,当用户下单完毕后,会进行库存扣减等相关操作,如果库存扣减完毕后再返回给用户下单成功显然不是很友好,为了解决这个问题就可以使用MQ,实现异步减少响应耗时。
削峰
在电商系统中,平时的请求量是足以应对的,但是诸如618、11 11等大促日期,假设订单系统每秒只能处理2000个请求的时候,那么订单系统将会崩溃。当引入MQ后,A系统可以慢慢去MQ中拉取请求进行处理,不至于系统崩溃。
在这里面涉及到一个MQ消息积压问题,因为平时每秒的下单量可能也就200, 过去了高峰期MQ仍以2000/s消耗队列任务,进行任务消费。还可以补充说明一些增加消费者、扩充队列容量等方案。
解耦
场景举例
在电商系统中,订单管理系统需要将订单数据发送给库存管理系统、物流管理系统和财务管理系统三个系统。如果此时新加入一个其它系统或者财务管理系统不需要订单管理系统下发了呢,在这里面各个系统都与订单管理系统存在高度耦合。
这个时候引入MQ,订单管理系统完全可以将消息发送到MQ中,至于你其他什么系统需要这个数据就自己去MQ中去拿就好了,不需要考虑其它系统是否成功调用等情况。
对与在工业物联网工作的小伙伴,应该也使用过自己维护的系统(MQTT协议通讯)->EMQX<-外部系统,AGV等(MQTT通讯)
这里面的EMQX就是一个Broker服务器,我们的系统只需要发布相应的Topic给Emqx服务器就好了,Agv或者其他系统如果需要就去Broker进行Topic订阅。在这里Emqx就实现各个系统间的解耦。