消息队列mq的作用、优缺点和几种常见的消息队列

目录

1.定义

2.消息队列的三个最主要的作用是:异步、削峰、解耦

3.消息队列的缺点

4.从三高的层面去审视一下这个设计

4.几种常见的消息队列


1.定义

        消息队列:一般我们会简称它为MQ(Message Queue)。

         Message Query(MQ),消息队列中间件,很多初学者认为,MQ通过消息的发送和接受来实现程序的异步和解耦,mq主要用于异步操作,这个不是mq的真正目的,只不过是mq的应用,mq真正的目的是为了通讯。

        他屏蔽了复杂的通讯协议,像常用的dubbo,http协议都是同步的。

         这两种协议很难实现双端通讯,A调用B,B也可以主动调用A,而且不支持长连接。 mq做的就是在这些协议上构建一个简单协议——生产者、消费者模型,mq带给我们的不是底层的通讯协议,而是更高层次的通讯模型。他定义了两个对象:发送数据的叫做生产者,接受消息的叫做消费者,我们可以无视底层的通讯协议,我们可以自己定义生产者消费者。

2.消息队列的三个最主要的作用是:异步、削峰、解耦

        消息队列就像是一个三峡大坝,用来拦截上游给的压力。

        异步:之前一步做完的事情,改为了多步

        削峰:(比如流量忽然多了之前的100倍,而程序就是为了之间的数据量大小设计的)压力堆到mq中,消费者不需要抗住激增的数据,消息会放到消息队列中,消费者慢慢消费就可以。将激增的流量通过mq进行阻拦,不至于压垮下游服务。服务器中如果说有一个服务宕机了,很可能产生连锁反应,让整个系统瘫痪

        解耦:将生产者和消费者解耦,生产者只要将消息放进mq中,生产者的任务就完成了,且各消费者之间互不关联

(由上面一般的形式的改为下面的用mq实现)

mq一般用于修改操作(当我的修改操作,调用链过长时,就需要用到mq了) 

3.消息队列的缺点

        ①、增加了系统复杂性。

                所以说如果说你的业务量不大,并发也不高,就没必要使用消息队列。

        ②、事务问题。

                事务问题其实是分布式系统肯定会存在的一个问题,只不过消息队列更严重一些。一般解决方案有两种,第一种就是采用分布式事务,这个下单的里涉及的所有服务放到一个事务里面,要么都成功,要么都失败。第二种就是,消费者做好合理的数据补偿措施,比如说,消息重试,人工刷数据等等。

        ③、可用性

        刚才讲了解耦,其实是系统的各个模块之间的解耦,但是这些模块都和消息队列关联,万一消息队列挂了,就真的下不了单了。为了保证可用性,我们可以采用消息队列集群,前端流量限流等,后面会介绍。

4.从三高的层面去审视一下这个设计

        高可用:当我系统里的一个模块宕机了,不会影响到我其他服务。(可以通过数据补偿或者分布式事务来保证数据最终一致性)

        高性能:用户下单,将下单所需要的数据都放到消息队列里,就直接返回了,所有耗时相当于就是网络传输所耗时。

        高并发:由于消息队列不处理任何业务上的逻辑,所有他支持的并发是百万级别的。假如有100万个用户下单,100万的数据放到消息队列里,连接消息队列的服务慢慢消费即可,也不至于造成瞬间有百万请求进来,将我的服务压垮。

4.几种常见的消息队列

其中kafka和rocketmq现在在互联网大厂使用最广泛,因为吞吐量大。

猜你喜欢

转载自blog.csdn.net/qq_52240237/article/details/132030145