带你整理面试过程中关于消息队列MQ的相关知识

Posted 南淮北安

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了带你整理面试过程中关于消息队列MQ的相关知识相关的知识,希望对你有一定的参考价值。

文章目录

一、消息队列

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

我们先不管消息(Message)这个词,来看看队列(Queue)。这一看,队列大家应该都熟悉吧。

消息队列可以简单理解为:把要传输的数据放在队列中。

把数据放到消息队列叫做生产者
从消息队列里边取数据叫做消费者

二、消息队列的模式

点对点模式(一对一,消费者主动拉取数据,消息收到后消息清除)

发布/订阅模式(一对多,数据生产后,推送给所有订阅者)

三、消息队列的特点

优点
(1)异步通信:消息队列允许异步通信,当提交信息可以不用及时处理的时候,可以存入消息队列。

比如一个订单系统,下单到支付到结束,支付和结束之间可能还有优惠券系统和积分系统,如果一步一步往下进行,速度太慢了影响用户体验,所以可以采用异步同时做,下单成功将消息放到消息队列里,此时优惠券系统和积分系统从消息队列分别取信息进行自己的操作。

(2)解耦:消息队列可以降低工程与工程之间的依赖程度,两方都同时遵守这个接口就行。

这也是为什么不用多线程的原因,比如刚才说的订单系统,如果使用多线程,那么没加一个业务就要调用一个接口重新发布,耦合度高,问题排查也困难;如果使用消息队列的话,下单之后把支付成功的消息告诉别的系统即可,其他的功能让他们收到了去处理即可。各个流程互相各自执行

(3)削峰:便于过载保护,防止访问量大增处理不过来而超负荷崩溃。

因为把请求都放到了队列里,所以每秒消费多少请求,可以根据自己的服务器处理能力,防止服务器崩溃

缺点
(1)系统复杂性

本来很简单的一个系统,现在加了个中间件,需要考虑维护,和遇到的各种问题(重复消费、消息丢失、消息的顺序消费)

(2)数据一致性

每个服务都保证自己的逻辑成功处理,但是只有所有的服务都成功,才能算这次下单成功。
解决办法:可以借助分布式事务,把所有的服务(下单,优惠券,积分)都放到一个事务里,要成功一起成功,要失败一起失败

(3)可用性

本来系统没啥问题,现在加了个中间件,万一挂了,其他服务也都会受到影响

无论是我们使用消息队列来做解耦、异步还是削峰,消息队列肯定不能是单机的。试着想一下,如果是单机的消息队列,万一这台机器挂了,那我们整个系统几乎就是不可用了。


所以,当我们项目中使用消息队列,都是得集群/分布式的。要做集群/分布式就必然希望该消息队列能够提供现成的支持,而不是自己写代码手动去实现。

存在的问题:

消息重复:幂等控制
消息丢失:异常监控

详细学习参考:
【1】消息队列基础知识
【2】https://www.zhihu.com/question/54152397?sort=created

以上是关于带你整理面试过程中关于消息队列MQ的相关知识的主要内容,如果未能解决你的问题,请参考以下文章

带你整理面试过程中关于 Java中对于栈和队列的复习的相关知识点

带你整理面试过程中关于ThreadLocal的相关知识

带你整理面试过程中关于锁的相关知识点下

带你整理面试过程中关于ARP 协议的相关知识点

带你整理面试过程中关于多线程中的线程池的相关知识点

带你整理面试过程中关于 Java 中的 异常分类及处理的相关知识