RabbitMQ 是基于 Erlang 实现 AMQP 协议的消息中间件。
RabbitMQ 整体上是一个生产者消费者模型,如下图。
为了便于理解,可以将图中拆分为生产环节和消费环节。
对于生产环节 ,有这3个概念:
Producer: 生产者,将其理解为携带信封的人。
RoutingKey: 邮箱的地址。
Exchange: 邮箱。
三者结合理解起来为:一个携带信封的人,沿着邮箱地址行走,将信投递到某一个邮箱中。
对于消费环节,同样有3个概念:
BindingKey: 收件地址
Queue: 菜鸟驿站
Consumer: 收件人
三者结合起来理解:信件根据收件地址,投递到了某个菜鸟驿站,驿站里存放了各种各样的信件,收件人可以从驿站中取走自己的信件。
以上就是一种比较简单形象地理解生产者消费者模型的方式,有了上面初步的感性认知,那么下面就对于几个角色做更详尽的说明。
图中虚线框部分,可以将其看作是一个 RabbitMQ 服务实例。
Producer 负责将消息投递到 Exchange 中,消息的主体是 payload,一般业务数据会以json字符串形式放入 payload 中。
Exchange 也称为交换机,在 RabbitMQ 中有四种类型,其中默认为 “direct”,另外三种分别是"topic",“fanout”,“head”。交换机需要将消息路由到指定的队列,如果找不到指定的队列,则消息会丢失。路由队列的方法,对于不同类型的交换机,有不同的方式,具体可以参照这里
Producer 需要指定 RoutingKey 将消息投递到 Exchange 中。
BindingKey 负责将 Exchange 和 Queue 关联起来。
队列。对于 RabbitMQ 来说,消息主要存储到队列中
Producer 连接到 Broker,建立一个 Connection,并开启一个 Channel。(需要注意,Connection 可以复用,即一个 Connection 可以建立多个 Channel)。具体细节如图
Producer 将 Protocol Header 0-9-1 报文头部发送到 Broker,后者返回 Connection.Start 表明开始建立连接。
当 Produer 收到 Channel.Open-Ok 时,表明 Channel已建立完毕,可以开始发送消息了。
通过 Basic.Pubish 将消息投递到 Exchange 中。
当需要关闭时,则需要依次关闭 Channel, 和 Connection。
和生产环境类似,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 全称 Advanced Message Queuing Protocol,是一个通信协议。
协议本身包含三层结构
它的模型架构即上述所演示,涉及 Producer, Consumer,Exchange, Queue 等,报文的交互即上述的两张图。
值得注意的是 AMQP 就类似于 FTP, 属于应用层协议,它规范了消息传递方和接收方的行为,以使消息在不同的具体实现中能够互相识别。
本文通过图解方式,简单介绍了 RabbitMQ 的一些核心概念,熟知这些概念,再查阅相关客户端开发文档,即可快速上手 RabbitMQ 的业务开发。如需再深入,可以进一步阅读以下参考资料。