带你整理面试过程中关于消息队列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的相关知识的主要内容,如果未能解决你的问题,请参考以下文章