- AMQP协议是什么
- RabbitMQ的模型架构是什么?
- 以上两者有什么联系?
- 消息从生产者发出到消费者消费这一过程中要经历一些什么?
2.1 相关概念介绍
RabbitMQ整体上是一个生产者-消费者模型,主要负责接收、存储和转发消息。
2.1.1 生产者和消费者
Producer:生产者,就是投递消息的一方。
生产者创建消息,然后发布到RabbitMQ中。消息一般包含2个部分:标签和消息体。
Consumer:消费者,就是接收消息的一方。
消费者连接到RabbitMQ服务器,并订阅到队列上。当消费者消费一条消息时,只是消费消息的消息体。在消息路由的过程中,消息的标签会被丢弃,存入到队列中的消息只有消息体。
Broker:消息中间件的服务节点。
对于RabbitMQ来说,一个RabbitMQ Broker可以简单看作一个RabbitMQ服务节点,或者服务实例。
下图展示了生产者将消息存入RabbitMQ Broker,以及消费者从Broker中消费数据的整个流程。
2.1.2 队列
Queue:队列,是RabbitMQ的内部对象,用于存储消息。
RabbitMQ中消息都只能存储在队列中,这一点和Kafka不同。RabbitMQ的生产者生产消息并最终投递到队列中,消费者可以从队列中获取消息并消费。多个消费者可以订阅同一个队列,这时队列中的消息会被平均分摊(Round-Robin,即轮询)给多个消费者处理,而不是每个消费者都受到所有的消息并处理,如下图所示。
R**abbitMQ不支持队列层面的广播消费**。(可以用Exchanger来实现广播,广播到多个消息队列)
2.1.3 交换器、路由键、绑定
Exchange:交换器。
生产者将消息发送到Exchange,由Exchange将消息路由到一个或者多个队列中。如果路由不到,或许会返回给生产者,或许直接丢弃。
RabbitMQ中的交换器有四种类型,不同类型的交换器有不同的路由策略,下一节详解。
RoutingKey:路由键。
生产者将消息发送给交换器的时候,一般会指定一个RoutingKey,用来指定这个消息的路由规则。而这个Routing Key需要与交换器类型和绑定键(BindingKey)联合使用才能最终生效。在交换器类型和绑定键(BindingKey)固定的情况下,生产者可以在发送消息给交换器时,通过指定RoutingKey来决定消息流向哪里。
Binding:绑定。
RabbitMQ中通过绑定将交换器与队列关联起来,在绑定的时候一般会指定一个绑定键(BindingKey),这样RabbitMQ就知道如何正确地将消息路由到队列了(BindingKey标识一条路径)。
生产者将消息发送给交换器时,需要一个RoutingKey,当BindingKey和RoutingKey相匹配时,消息会被路由到相应的队列中。在绑定多个队列到同一个交换器的时候,这些绑定允许使用相同的BindingKey。BindingKey并非所有情况下都生效,它依赖于交换器的类型。
BindingKey可RoutingKey可视为一个东西,只不过一个在绑定时使用,一个在路由时使用。
2.1.4 交换器类型
fanout
它会把所有发送到该交换器的消息路由到所有与该交换器绑定的队列中。
direct
它会把消息路由到那些BindingKey和RoutingKey完全匹配的队列中。
topic
topic与direct行为类似,只是在匹配方式上做了扩展,允许BindingKey和RoutingKey按照一定规则进行模糊匹配。
headers
headers类型的交换器不依赖于路由键的匹配规则来路由消息,而是根据发送的消息内容中的headers属性进行匹配。
2.1.5 RabbitMQ运转流程

新概念:Connection和Channel。
Connection指TCP连接。生产者和消费者都是通过TCP连接和RabbitMQ Broker连接并通信的。
Channel是建立在Connection基础上的虚拟连接。RabbitMQ处理的每条AMQP指令都是通过信道完成的。为什么不直接使用Connection,而是要引入Channel这个概念呢?主要是为了复用Connection。不同的Channel可以复用同一个Connection,从而节省资源。通常在多线程环境下,每个线程可以创建自己的Channel,但底层复用同一个Connection。不过在流量很大时,就需要建立多个Connection。
2.2 AMQP协议介绍
RabbitMQ就是AMQP协议的Erlang实现。此外RabbitMQ也支持STOMP、MQTT等协议。
RabbitMQ中的交换器、交换器类型、队列、绑定、路由键等都是遵循的AMQP协议中相应的概念。
AMQP协议本身包括三层:
- Module Layer:位于协议最高层,主要定义了一些客户端调用的命令,客户端可以利用这些命令实现自己的业务逻辑。
- Session Layer:位于中间层,主要负责将客户端的命令发送给服务器,再将服务端的应答返回给客户端,主要为客户端与服务器之间的通信提供可靠性同步机制和错误处理。
- Transport Layer:位于最底层,主要传输二进制数据流,提供帧的处理、信道复用、错误检测和数据表示等。
从网络分层模型的角度来讲,AMQP本身属于应用层协议,基于传输层TCP协议实现。
