RabbitMQ(消息队列)

一、MQ的概念

MQ全称(Message Queue---消息队列),是在消息的传输构成中保存消息的容器,多用于分布式系统之间的消息通信。

RabbitMQ(消息队列)_第1张图片

  • 在分布式系统中,不同子系统之前的消息通信主要有两种方式:
    • 直接通信即A系统和B系统之间通过RPC远程调用的方式进行相互通信
    • 间接通信:通过第三方的介入,比如MQ,A系统作为消息发送方将生产的消息发送给MQ,B系统作为接收方从MQ中获取消息进行消费
  • 其中,在使用MQ进行消息通信的时候,我们一般会把A系统(发送方)称之为消息的生产者,B系统(接收方)称之为消息的消费者

二、MQ的优势和劣势 

1.优势

  • 应用解耦:提高系统的容错性和可维护性

RabbitMQ(消息队列)_第2张图片

比如说,在设计一个商城项目中,假设我们分为了订单、库存、支付、物流四个模块,分别对应四个子系统,均采用RPC方式调用:

场景一:

        那么当一个用户下订单的时候,假设库存系统出现了问题,那么就会有可能导致订单系统也出现问题,从而导致整个下单业务失败,针对这种场景,那对系统的容错性就会越低

场景二:

        假设需求有变动,比如我在下订单的同时还要访问x系统、y系统......等其他系统,那么在这种需求频繁变动的时候,那对系统可维护性也就越低

那么,如果系统的耦合性越高的话,那么对应系统的容错性就会越低,可维护性也就越低

那么,我们如何解决这种场景下产生的问题呢?

RabbitMQ(消息队列)_第3张图片

此时我们可以引入消息队列MQ,当用户下订单的时候,订单系统只需要将订单信息发送给MQ即可:

同样的,针对上述场景产生问题,如果说其他子系统出现了故障,那么在引入MQ之后,其他子系统和订单系统之间是相互隔离的,这个时候就不会对订单系统造成影响,等子系统恢复之后,只需要从MQ中获取订单系统发送过来的消息进行消费即可,大大提升了整个系统的容错性,如果后续子系统增加或减少的话,也不会在订单系统中频繁修改代码,子系统只需要在MQ中获取消息消费即可,也提升了系统的可维护性

那么,使用MQ之后可以对应用进行解耦,提升了系统的容错性和可维护性

  • 异步提速:提升了用户体验和系统的吞吐量

RabbitMQ(消息队列)_第4张图片

在分布式系统中,如果采用RPC的方式,当用户下完订单之后,会进行入库操作,同时需要对后续的其他子系统进行调用,调用完成之后才能完成整个下单流程,这个时候就是一个同步的状态,例如上图所示:总耗时为920ms,这个时候的耗时是很长的,用户体验感较差

RabbitMQ(消息队列)_第5张图片

那么在引入了MQ之后,针对整个下单操作 ,只需要在订单系统进行操作入库和将订单消息发送给MQ即可完成下单流程,而后续的入库、支付、物流等子系统从MQ中获取订单消息进行消费即可,这个时候就是一个异步的过程,例如上图,此时只需要25ms即可,大大提升了用户体验和系统性能

  • 削峰填谷:提高了系统稳定性

RabbitMQ(消息队列)_第6张图片

假设有一个A系统,每秒最多能够处理5000个请求,如果此时有一个秒杀需求,有大量的用户在向系统发出请求, 如果超过了A系统的承载能力,那么就有可能会导致系统崩溃,导致系统的可用性变差,用户体验降低。

RabbitMQ(消息队列)_第7张图片

 引入MQ之后,针对秒杀场景下大量请求访问的情况,此时用户只需要将请求发送到MQ中即可,系统只需要针对原来的承载能力,将请求分批处理即可,提升系统的稳定性,提高了用户体验。完成了高峰期的“削峰”过程,同时,当高峰期过去之后,系统就会趋于稳定到原来正常的请求状态,这个就叫做“填谷”

2.劣势

  • 系统可用性降低

系统引入的外部依赖越多,那么系统的稳定性就会变差。在常规分布式系统中,通过RPC调用只需要保证各个子系统正常就可以,在引入MQ之后,还需要保证MQ没有问题,如果MQ宕机,那么整个业务系统就会出问题。这个时候保证MQ的高可用就成为了一个问题。

  • 系统复杂度提高

MQ的加入大大增加了系统的复杂度,常规分布式系统中,子系统之间都是听过同步的方式进行远程调用,而现在是通过MQ进行异步调用。那么如何保证消息没有被重复消费,如何保证消息是否丢失,如何解决消息丢失问题,如何保证消息传递的时序性就成为了问题?

  • 一致性问题

假设A系统处理完业务,通过MQ给B、C、D三个系统放松消息数据,如果B、C系统处理成功,而D系统处理失败了,这种情况下如何去保证系统消息数据处理的一致性?

三、常见的MQ产品

RabbitMQ(消息队列)_第8张图片

四、RabbitMQ

AMQP(Advanced Message Queuing Protocol)即高级消息队列协议,是一个网络协议,是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受客户端、中间件不同的产品,不同的开发语言等条件的限制。

RabbitMQ(消息队列)_第9张图片

 2007年,Rabbit技术公司基于AMQP标砖开发的RabbitMQ1.0发布,它采用Erlang语言开发

RabbitMQ(消息队列)_第10张图片

RabbitMQ(消息队列)_第11张图片RabbitMQ(消息队列)_第12张图片

 RabbitMQ提供了6种工作模式:简单模式、work queues、Publish/Subscribe 发布与订阅模式、Routing路由模式、Topic主体模式、RPC远程调用模式

https://www.rabbitmq.com/#getstartedicon-default.png?t=N7T8http://xn--rabbitmq-pl2mj41jyxcw51c

持续更新中!!!!

你可能感兴趣的:(rabbitmq)