MQ概念
Message Queue(消息队列),在消息的传输过程中保存消息的容器,多用于分布式系统之间进行通信。
就是两个子系统之间进行通信,有两种选择,第一种是直接远程调用,第二种是借助第三方完成通信。
发送方称为生产者,接收方称为接受者。
MQ的优势
1、应用解耦
应用解耦的意思:设计系统追求高内聚低耦合的目的,那么分布式也是这样的,就是降低系统和系统之间的耦合性。
实战分析:订单系统通过远程调用子系统完成业务。
也就是说订单系统会和库存系统、支付系统、物流系统是耦合的,如果库存系统挂了,那么订单系统就会挂。那么就称这个系统的容错性比较低;还有如果加一个x系统,那么程序员只能修改订单系统,这样就会很难受,不停修改订单系统,可维护性降低了。
那么如何通过MQ来解决呢。
用户下单,订单系统发送一个信息给MQ,然后订单系统就会返回一个下单成功的信息给用户。然后MQ给子系统发消息。这个时候即使库存系统出错了,可能出错了一小会,然后好了,然后再从MQ中拿就好了。
如果要加X系统,那么这个时候X只需要从MQ中拿就可以了,跟订单系统没有关系的。程序员不需要从订单系统中加什么代码。
增加了可维护性与解耦性。
2、异步提速
订单系统保存自己的数据库20ms,这个300ms是同步的过程,订单系统先调用库存系统300ms,然后支付系统300ms,然后物流系统300ms,然后再返回给订单系统。这个时候需要损耗的时间:
一般是200ms内得到相应才可以提升用户体验。
这个只需要25ms,提升了用户体验,不需要管是否成功。
1s中的吞吐量提升了。
3、削峰填谷
当进行一个秒杀的话,那么A系统就宕机了,用户体验太差了。
现在可以用MQ来消除这个峰值,这个时候用户发送请求给MQ就行。请求都是对接到MQ,MQ专门做这种事的,然后A系统再慢慢的拉1000个请求来处理,这个时候A系统就可以稳定很多了。
MQ的劣势
只有明确了缺点,才能更好的规避,更好的进行服务。
1、系统可用性降低
A、B子系统之间加一个MQ,可用性降低了。
这个时候还要保证MQ没有问题。
也就是说引入了外部依赖,系统的稳定性变差了,一旦MQ宕机,就会对于业务造成影响,这个时候就要保证高可用了。
2、系统复杂度提高
以前系统是同步的远程调用,现在是进行MQ异步调用。
如何保证消息没有被重复消费?怎么处理消息丢失情况?如何保证消息传递的顺序性?
3、一致性问题
A处理完业务,通过MQ给BCD发送消息,BC成功,D失败,那么如何保证消息处理的一致性呢?
上述几个问题会经常在面试中问到。所以需要好好考虑。
使用MQ需要的条件
常见的MQ用品
RabbitMQ专门适合高并发的场景。
RabbitMQ简介
基于AMQP协议,Adavanced Message Queuing Protocol 高级消息队列协议。是一个网络协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端等限制。类比HTTP。