天天看点

RabbitMQ相关概念

关概念介绍

RabbitMQ 整体上是一个生产者与消费者模型,主要负责接收,存储和转发消息。可以把消息传递的过程想象成:当你将一个包裹送到邮局,邮局会暂存并最终将邮件通过邮递员送到收件人的手上, RabbitMQ 就好比由邮局,邮箱和邮递员组成的一个系统。从计算机术语层面来说RabbitMQ 模型更像是一种交换机模型。

RabbitMQ 模型架构

RabbitMQ相关概念

生产者和消费者

Producer:生产者,就是投递消息的一方。生产者创建消息,然后发布到 RabbitMQ 中。消息般可以包含2个部分:消息体和标签Label。消息体也可以称之为payload,在实际应用中,消息体一般是一个带有业务逻辑结构的数据,比如一个 JSON 字符串。当然可以进一步对这个消息体进行序列化操作。消息的标签用来表述这条消息,比如一个交换器的名称和一个路由键。生产者把消息交由RabbitMQ,RabbitMQ之后会根据标签把消息发送给感兴趣的消费者Consumer。

Consumer:消费者就是接收消息的一方。

消费者连接到RabbitMQ服务器,并订阅到队列上。当消费者消费一条消息时,只是消费消息的消息体 payload。在消息路由的过程中,消息的标签会丢弃,存入到队列中的消息只有消息体,消费者也只会消费到消息体,也就不知道消息的生产者是谁,当然消费者也不需要知道。

Broker:消息中间件的服务节点。

对于RabbitMQ来说,RabbitMQ Broker可以简单看作一个RabbitMQ服务节点,或者 RabbitMQ 服务实例。大多数情况下RabbitMQ Broker看作一台RabbitMQ服务器。

生产者将消息存入RabbitMQ Broker,以及消费者从Broker中消费数据的整个流程

RabbitMQ相关概念

队列

Queue:队列是RabbitMQ内部对象,用于存储消息。RabbitMQ中消息都只能存储在队列中,RabbitMQ 的生产者生产消息井最终技递到队列中,消费者可以从队列中获取消息并消费。多个消费者可以订阅同一个队列,这时队列中的消息会被平均分摊 (Round-Robin,即轮询)给多个消费者进行处理,而不是每个消费者都收到所有的消息井处理。

RabbitMQ相关概念

交换器、路由键、绑定

Exchange:交换器,在上面队列介绍中暂时可以理解成生产者将消息投递到队列中,实际上

这个在 RabbitMQ中不会发生。真实情况是,生产者将消息发送到 Exchange,由交换器将消息路由到一个或者多个队列中。如果路由不到,或许会返回给生产者,或许直接丢弃。

RoutingKey:路由键。生产者将消息发给交换器的时候,一般会指定一个RoutingKey,用来指定这个消息的路由规则,而这个RoutingKey需要与交换器类型和绑定键 (BindingKey)合使用才能最终生效。在交换器类型和绑定键 (BindingKey) 固定的情况下,生产者可以在发送消息给交换器时,通过指定RoutingKey来决定消息流向哪里。

Binding:绑定。RabbitMQ中通过绑定将交换器与队列关联起来,在绑定的时候一般会指定一个绑定键 BindingKey,这样RabbitMQ就知道如何正确将消息路由到队列了。

生产者将消息发送给交换器时,需要一 RoutingKey,当BindingKey和RoutingKey相匹时,消息会被路由 到对应的队列中。在绑定多个队列到同一个交换器的时候这些绑定允许使用相同的BindingKey。BindingKey并不是在所有的情况下都生效,它依赖于交换器类型,比如fanout类型的交换器就会无BindingKey而是将消息路由到所有绑定到该交换器的队列中。在某些情形下(如使用direct交换器类型)RoutingKey和BindingKey可以看作同一个东西。

RabbitMQ相关概念
RabbitMQ相关概念

交换器类型

RabbitMQ常用的交换器类型有fanout,direct,topic,headers四种。

Fanout Exchange:它会把所有发送到该交换器的消息路由到所有与该交换器绑定的队列中,无视BindingKey。

RabbitMQ相关概念

Direct Exchange:它会把消息路由到那些BindingKey和RoutingKey完全匹配的队列中。

RabbitMQ相关概念

Topic Exchange:将路由键和某模式进行匹配。此时队列需要绑定要一个模式上。符号“#”匹配一个或多个词,符号“”匹配一个词。因此“audit.#”能够匹配到“audit.irs.corporate”,但是“audit.” 只会匹配到“audit.irs”。(具体的RoutingKey和模糊的BindingKey进行模糊匹配)

RabbitMQ相关概念

Nameless exchange(匿名转发)

使用默认的转发器,转发器名为空字符串"",也可以将消息发送到队列。

channel.BasicPublish("", “hello”, null, mseeage.GetBytes());

RabbitMQ 运转流程

生产者流程:

  • 生产者连接到 RabbitMQ Broker 建立一个连接( Connection) ,开启 个信道 (Channel)。
  • 生产者声明一个交换器 ,并设置相关属性,比如交换机类型、是否持久化等。
  • 生产者声明 个队列井设置相关属性,比如是否排他、是否持久化、是否自动删除等。
  • 生产者通过路由键将交换器和队列绑定起来。
  • 生产者发送消息至 RabbitMQ Broker,其中包含路由键、换器等信息。
  • 相应的交换器根据接收到的路由键查找相匹配的队列。
  • 如果找到 ,则将从生产者发送过来的消息存入相应的队列中。如果没有找到 ,则根据生产者配置的属性选择丢弃还是回退给生产者。
  • 关闭信道。关闭连接。

消费者流程:

  • 消费者连接到 RabbitMQ Broker,建立一个连接(Connection),开启 个信道(Channel)。
  • 消费者向 RabbitMQ Broker 请求消费相应队列中的消息,可能会设置相应的回调函数,

    以及做 些准备工作。

  • 等待 RabbitMQ Broker 回应并投递相应队列中的消息, 消费者接收消息。
  • 消费者确认(ack) 接收到的消息。
  • RabbitMQ 从队列中删除相应己经被确认的消息。
  • 关闭信道。关闭连接。

无论是生者还是消费者,都需要和 RabbitMQ Broker 建立连接,这个连接就是一条 TCP 连接,也就是

Connection。一旦 TCP 连接建立起来,客户端紧接着可以创建一个 AMQP 信道 (Channel) ,每个信道都会被指派一个唯一ID。信道是建立在 Connection 之上的虚拟连接, RabbitMQ 处理的每条 AMQP 指令都是通过信道完成的。

RabbitMQ相关概念

AMQP 协议介绍

RabbitMQ 就是 AMQP (Advanced Message Queuing Protocol,高级消息队列协议) 的 Erlang 的实现。AMQP 的模型架构和 RabbitMQ 的模型架构是一样的,生产者将消息发送给交换器,交换器和队列绑定 。当生产者发送消息时所携带的 RoutingKey 与绑定时 BindingKey 匹配时,消息即被存入相应的队列之中。消费者可以订阅相应的队列来获取消息。

AMQP生产者流转过程

RabbitMQ相关概念

AMQP消费者流转过程

RabbitMQ相关概念

AMQP命令总览

名称 是否包含内容体 对应客户端中的方法 简要描述
Connection.start factory.newConnection 建立连接相关
Connection.Start-Ok 同上 同上
Connection.Tune 同上 同上
Connection.Tune-Ok 同上 同上
Connection.Open 同上 同上
Connection.Open-Ok 同上 同上
Connection.Close connection.close 关闭连接
Connection.Close-Ok 同上 同上
Channel.Open connection.openChannel 开启信道
Channel.Open-Ok 同上 同上
Cbannel.Close channel.close 关闭信道
Channel.Close-Ok 同上 同上
Exchange.Declare channel.exchangeDeclare 声明交换器
Exchange.Declare-Ok 同上 同上
Exchange.Delete channel.ExchangeDelete 删除交换器
Exchangge.Delete-Ok 同上 同上
Exchange.Bind channel.ExchanggeBind 交换器与交换器绑定
Exchange.Bind-Ok 同上 同上
Exchange.Unbind channel.ExchangeUnbind 交换器与交换器解绑
Exchange.Unbind-Ok 同上 同上
Queue.Declare channel.queueDeclare 声明队列
Queue. Declare-Ok 同上 同上
Queue.Bind channel.queueBind 队列与交换器绑定
Queue.Bind-Ok 同上 同上
Queue.Purge channel.queuePurge 清除队列中的内容
Queue.Purge-Ok 同上 同上
Queue.Delete channel.queueDelete 删除队列
Queue.Delete-Ok 同上 同上
Queue.Unbind channel.queueUnbind 队列与交换器解绑
Queue.Unbind-Ok 同上 同上
Basic.Qos channel.basicQos 设置未被确认消费的个数
Basic.Qos-Ok 同上 同上
Basic.Consume channel.basicConsume 消费消息(推模式)
BasiιConsurne-Ok 同上 同上
Basic.Cancel channel.basicCancel 取消
Basic.Cancel-Ok 同上 同上
Basic.Publish channel.basicPublish 发送消息
Basic.Return 未能成功路由的消息返回
Basic.Deliver Broker 推送消息
Basic.Get channel.basicGet 消费消息(拉模式)
Basic.Get-Ok 同上 同上
Basic.Ack channel.basicAck 确认
Basic.Reject channel.basicReject 拒绝(单条拒绝)
Basic.Recover channel.basicRecover 请求 Broker 重新发送未被确认的消息
Basic.Recover-Ok 同上 同上
Basic.Nack channel.basicNack 拒绝(可批量拒绝)
Tx.Select channel. txSelect 开启事务
TX.Select-Ok 同上 同上
Tx.Cornmit channel. txCommit 事务提交
TX.Commit-Ok 同上 同上
Tx.Rollback channel.txRollback 事务回滚
TX.Rollback-Ok 同上 同上
Confirrn Select channel.confinnSelect 开启发送端确认模式
Confinn.Select-Ok 同上 同上

总结

本章主要讲述的是 RabbitMQ 的入门知识,首先介绍了生产者(Producer)、消费者(Consumer)、队列 (Queue) 、交换器 (Exchange) 、路由键 (RoutingKey)、绑定 (Binding) 连接 (Connection) 和信道(Channel) 等基本术语,还介绍了交换器的类型 fanout、direct、topic、headers。通过介绍 RabbitMQ 的运转流程来加深对基本术语的理解。