一、什么是消息队列
MQ全称:Message Queue, 消息队列是应用程序和应用程序之间的通信方法,它的数据结构就是队列,并且符合队列的特性,先进先出。既然如此,我们为什么不直接使用队列呢。我认为有以下几点原因:1.它对队列进行增强,方便我们使用,减少了代码量,我们如果自己用队列,得考虑很多东西,比如数据丢失,数据存储等等,2.我们的应用程序,也就是Java程序都是运行在JVM中的,JVM本身就是一个应用程序,它在运行时就设置了一定的内存资源,而是用中间件就减少这部分资源的使用,降低OOM的风险。3.解耦,在微服务开发中,一般会部署多个实例,如果使用队列,每一个实例都会创建一个数据自己的,不能共享,也就造成幂等性,使用消息中间件可以解决大部分的问题。
二、RabbitMQ工作原理
一个消费者监听一个队列
- Broker:消息队列服务进程,此进程包括两个部分:Exchange和Queue。
- Exchange:消息队列交换机,按一定的规则将消息路由转发到某个队列,对消息进行过虑。
- Queue:消息队列,存储消息的队列,消息到达队列并转发给指定的消费方。
- Producer:消息生产者,即生产方客户端,生产方客户端将消息发送到MQ。
- Consumer:消息消费者,即消费方客户端,接收MQ转发的消息。
消息发布接受流程:
发送消息(producer):首先生产者和Broker建立TCP连接,生产者和broker建立管道,生产者通过管道将消息发送给Broker,由Exchange将消息进行转发到指定的Queue(队列)。
接受消息(consumer):消费者和Broker建立TCP连接,消费者和broker建立通道,监听指定的queue(队列),当有消息到达Queue时Broker默认将消息推送给消费者,消费者接受到消息。
三、工作模式
1.简单队列模式
一个生产者对应一个消费者。
2.工作队列模式:
一个生产者对应多个消费者,多个消费者消费共同消费同一个队列的消息,
一个消息被多个消费者中的一个消费,且只消费一次。默认轮询分发的方式。
3.发布/订阅模式:
和工作队列模式相比,多增加了一个交换机,
交换机Exchange有以下三种常见类型:
Fanout:广播 ,将消息交给所有绑定到交换机的队列
Direct:定向,把消息交给符合指定routing key 的队列
Topic:通配符,把消息交给符合routing pattern(路由模式)的队列
4.Routing路由模式
消息的发送方在向Exchange发送消息时,也必须指定消息的Routingkey。
Exchange不再把消息交给每一个绑定的队列,而是根据消息的Routing Key进行判断,只有队列的Routing Key与消息Routing Key完全一致才会接收到消息。
也就是交换机通过路由规则将消息分发到绑定的队列中。
5.Topic模式
使用通配符方式的Routingkey进行路由。