1.MQ概述
MQ全称Message Queue(消息队列),是在消息的传送过程中保存消息的容器。多用于分布式系统之间进行通信。
2.MQ的优势
(1)应用解耦
MQ相当于一个中介,生产方式通过MQ与消费者交互,它将应用程序进行解耦。提升容错性和可维护性。
(2)任务异步处理
将不需要同步处理的并且耗时长的操作由消息队列通知消息接收方进行异步处理。提高了应用程序的响应速度。
(3)削峰填谷
如订单系统,在下单的时候就会往数据库中写数据。但是数据库只能支持每秒1000左右的并发写入,并发量再高就容易宕机。低峰期的时候并发也就100多个,但是在高峰期时候,并发量会突然增加到5000以上,这个时候数据库肯定卡死了。
消息被MQ保存起来了,然后系统就可以按照自己的消费能力来消费,比如每秒1000个消息,这样慢慢写入数据库,这样就不会卡死数据库了。
但是使用了MQ之后,限制消费消息的速度为1000,但是这样一来,高峰期产生的数据势必会被积压MQ中,高峰就被削掉了。但是因为消息积压,在高峰期过后的一段时间内,消费消息的速度还是会维持在1000QPS,直到消费完积压的消息,就叫做填谷。
3.Rabbit MQ
(1)入门
简单模式
在上图的模型中,有以下概念:
P:生产者,也就是要发送消息的程序
C:消费者,消息的接收者,会一直等待消息到来
queue:消息队列,红色部分。生产者从中投递消息,消费者从中取出消息。
(2)work queues工作队列模式
work queues与入门程序的简单模式相比,多了一个或一些消费端,多个消费端共同获取一个队列中的消息。
应用场景:对于任务过重或者任务较多情况使用工作队列可以提高任务处理的速度。
(3)订阅模式
订阅模式,多了一个exchange角色。
Exchange:交换机,图中的X,一方面,接收生产者发送的消息。另一方面,知道如何处理消息,例如递交给某个特别队列,递交给所有队列、或是将消息丢弃。到底是如何操作,取决于Exchange的类型。Exchange有常见的三种类型:
Fanout:广播,将消息交给所有绑定到交换机的队列
Direct:定向,把消息交给符合指定routing key的队列
Topic:通配符,把消息交给符合routing pattern的队列
Exchange只负责转发消息,不具备存储消息的能力,因此如果没有任何队列与Exchange绑定,或者没有符合路由规则的队列,那么消息就会消失。
(4)发布与订阅模式
发布订阅模式:每个消费者监听自己的队列;生产者将消息发给broker,由交换机将消息转发到绑定此交换机的每个队列,每个绑定交换机的队列都将接收到消息。