一、相关概念介绍
RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的。它整体上是一个生产者与消费者模型,主要负责接收、存储和转发消息。
1.生产者和消费者
Producer:生产者,就是投递消息的一方。
消息包含消息体和标签两个部分。消息体也可称为payload, 一般是带有逻辑业务结构的数据,比如JSON字符串。标签用来表述信息。
Consumer:消费者,接受消息的一方
消息的路由过程中,标签会被丢弃,存入队列和和被消费者消费的都是消息体。
Broker:消息中间件的服务节点
由队列(queue)和交换机(exchange)组成
2.队列
队列是RabbitMQ的内部对象,用于存储消息。RabbitMQ中的消息智能存储在队列中,因为生产者生产的消息最终都投递到了队列中。
消费者可以订阅同一个队列,这时队列中的消息会被平均分摊。
3.交换器、路由键,绑定
Exchange:交换器。生产者将消息发送到交换器,然后交换器将消息路由到一个或多个队列,如果路由不到,则返回生产者或者丢弃。
RoutingKey:路由键,生产者将消息发给交换机时一般会指定一个RoutingKey, 用来指定这个消息的路由规则,而这个RoutingKey需要与交换器类型和绑定键结合才能最终生效。
Binding:绑定。RabbitMQ 中通过绑定将交换器与队列关联起来,在绑定的时候一般会绑定一般会绑定一个绑定键bandingKey。
生产者将消息发送给交换器时,需要一个RoutingKey,当Bandingkey和routingkey相配时,消息会被路由到对应的队列中。
4.交换器类型
fanout
它会把所有发送到该交换器的消息路由到所有与该交换器绑定的队列中。
direct
把消息路由到bindingkery和routingKey完全匹配的队列中去。
topic
同样是将bindingkey和routingkey绑定,但是规则有些不同。
它约定:
- RoutingKey为由"."分割的字符串,如com.rabbitmq.client
- BindingKey同样如此
- BindingKey可以存在两种不同的字符,“*"和”#“ 其中 * 用于匹配一个单词,#用于匹配多个单词
headers
headers的交换器不依赖于路由键的匹配规则来路由消息,而是根据发送的消息内容中的headers属性来进行匹配
5.RabbitMQ运转流程
生产者发送消息:
(1)生产者连接到Broker ,建立一个连接,开启一个信道
(2)生产者声明一个交换器,并设置相关属性
(3)生产者声明一个队列,并设置相关属性
(4)生产者通过路由键将交换器和队列绑定起来
(5)生产者发送消息到Broker
(6)相应的交换器根据接收到的路由键查找相匹配的队列。
(7)如果找到存入相应的队列,如果不匹配则根据收到的信息选择丢弃还是返还给生产者。
(8)关闭信道
(9)关闭连接
消费者接受消息
(1)消费者连接到Broker,建立一个连接,开启一个信道
(2)消费者向Broker 请求消费相应队列中的消息
(3)等待Broker回应并投递相应队列中的消息,消费者接受消息。
(4)消费者确认收到的消息
(5)rabbitmq从队列中删除相应已被确认的消息
(6)关闭信道
(7)关闭连接
二、AMQP协议介绍
RabbitMQ是遵从AMQP协议的,换句话说,RabbitMQ就是AMQP协议的Erlang实现。
AMQP协议本身包含三层:
- Model Layer:位于协议的最高层,只要定义了一些供客户端调用的命令,客户端可以利用这些命令实现自己的业务逻辑。
- Session Layer 位于中间层,主要负责将客户端的命令发送给服务器,再将服务器的应答返回给客户端,主要为客户端与服务器之间的通信提供可靠性同步机制和错误处理
- Transport Layer 位于最底层,主要传输二进制数据流,提供帧的处理、信道复用,错误检测和数据表示等。