图解 RabbitMQ 核心概念

RabbitMQ 主要概念

RabbitMQ 是基于 Erlang 实现 AMQP 协议的消息中间件。

RabbitMQ 整体上是一个生产者消费者模型,如下图。

图解 RabbitMQ 核心概念

为了便于理解,可以将图中拆分为生产环节和消费环节。

对于生产环节 ,有这3个概念:

Producer: 生产者,将其理解为携带信封的人。

RoutingKey: 邮箱的地址。

Exchange: 邮箱。

三者结合理解起来为:一个携带信封的人,沿着邮箱地址行走,将信投递到某一个邮箱中。

对于消费环节,同样有3个概念:

BindingKey: 收件地址

Queue: 菜鸟驿站

Consumer: 收件人

三者结合起来理解:信件根据收件地址,投递到了某个菜鸟驿站,驿站里存放了各种各样的信件,收件人可以从驿站中取走自己的信件。

以上就是一种比较简单形象地理解生产者消费者模型的方式,有了上面初步的感性认知,那么下面就对于几个角色做更详尽的说明。

Broker

图中虚线框部分,可以将其看作是一个 RabbitMQ 服务实例。

Producer

Producer 负责将消息投递到 Exchange 中,消息的主体是 payload,一般业务数据会以json字符串形式放入 payload 中。

Exchange

Exchange 也称为交换机,在 RabbitMQ 中有四种类型,其中默认为 "direct",另外三种分别是"topic","fanout","head"。交换机需要将消息路由到指定的队列,如果找不到指定的队列,则消息会丢失。路由队列的方法,对于不同类型的交换机,有不同的方式,具体可以参照这里

RoutingKey

Producer 需要指定 RoutingKey 将消息投递到 Exchange 中。

BindingKey

BindingKey 负责将 Exchange 和 Queue 关联起来。

Queue

队列。对于 RabbitMQ 来说,消息主要存储到队列中

消息生产流程

Producer 连接到 Broker,建立一个 Connection,并开启一个 Channel。(需要注意,Connection 可以复用,即一个 Connection 可以建立多个 Channel)。具体细节如图

图解 RabbitMQ 核心概念

Producer 将 Protocol Header 0-9-1 报文头部发送到 Broker,后者返回 Connection.Start 表明开始建立连接。

当 Produer 收到 Channel.Open-Ok 时,表明 Channel已建立完毕,可以开始发送消息了。

通过 Basic.Pubish 将消息投递到 Exchange 中。

当需要关闭时,则需要依次关闭 Channel, 和 Connection。

消息消费流程

图解 RabbitMQ 核心概念

和生产环境类似,Consumer 首先需要和 Brocker 建立连接,开启通道。

Consumer 向 Broker 发送 Basic.Consume,之后收到来自 Broker的回复 Basic.Consume-Ok,表面准备完成,即将推送消息。(这里注明一下,消费消息存在两种模式,该图场景是使用模式,还有另一种模式是 Consumer 主动向 Broker 拉取消息,而不是建立连接后等待消息的自动推送)

类似于 TCP 连接收到消息后有 ACK 应答,Consumer 消费完消息后,也需要 ACK 告知 Broker 消息已消费,可以从 Queue 中删除。对于实际开发来说,可以设置为自动 ACK,也可以处理完业务后再手动 ACK。

和生产流程,消费完成后,Consumer 和 Broker 断开连接依次经历 Channel 和 Connection 的关闭。

AMQP

AMQP 全称 Advanced Message Queuing Protocol,是一个通信协议。

协议本身包含三层结构

  • Module Layer:位于最顶层,提供一些客户端可调用的指令。
  • Session Layer:中间层,主要处理服务端与客户端的交互通信。
  • Transport Layer: 最底层,主要传输二进制数据流,提供帧处理能力,信道复用等功能。

它的模型架构即上述所演示,涉及 Producer, Consumer,Exchange, Queue 等,报文的交互即上述的两张图。

值得注意的是 AMQP 就类似于 FTP, 属于应用层协议,它规范了消息传递方和接收方的行为,以使消息在不同的具体实现中能够互相识别。

小结

本文通过图解方式,简单介绍了 RabbitMQ 的一些核心概念,熟知这些概念,再查阅相关客户端开发文档,即可快速上手 RabbitMQ 的业务开发。如需再深入,可以进一步阅读以下参考资料。

参考资料

上一篇:Java编程手冊-Collection框架(上)


下一篇:SpringBoot2.x 整合Kafka