RabbitMQ学习笔记-RabbitMQ的运转流程

导语
  在之前的分享中介绍了有关RabbitMQ的架构模型以及相关的术语,这里就来回顾一下整个的流程。

RabbitMQ整体架构

  在最初的状态下,消息的流转经历的就是如下这样的一个架构的流转。
在这里插入图片描述
生产者发送消息过程

  • 1、生产者连接到RabbitMQ Broker的时候会建立一个Connection,开启一个通道Channel,这个主要是利用了NIO的一些优化。
  • 2、在生产者上 声明一个交换器,并且设置相关属性,例如之前提到的交换机类型、是否需要持久化等
  • 3、生产者声明一个队列并设置队列相关的属性,例如是否排他、是否持久化、是否进行自动删除等等
  • 4、生产者通过路由键将交换器和队列进行绑定
  • 5、生产者发送消息到RabbitMQ Broker ,这其中就包含了路由键、交换器等信息。
  • 6、相应的交换器根据接收到的路由键信息进行查找匹配队列
  • 7、如果找到,则将从生产者发过来的消息存入到相应的队列中
  • 8、如果没有找到,则根据生产者配置的属性选择丢弃还是回退给生产者
  • 9、关闭Channel
  • 10、关闭Connection

消费者接收消息过程

  • 1、消费者连接到RabbitMQ Broker,建立一个Connection,开启一个信道Channel
  • 2、消费者想RabbitMQ Broker请求消费相应队列中的消息,可能会设置相应的回调函数,所以需要做一些准备工作
  • 3、等待RabbitMQ Broker 回应并投递相应队列中的消息,消费者接收消息
  • 4、消费者确认接收到的消息
  • 5、RabbitMQ 从队列中删除已经被确认的消息
  • 6、关闭Channel
  • 7、关闭Connection

Connection和Channel的概念

  无论是生产这还是消费者都要和RabbitMQ Broker进行连接,其中一个连接就是一条TCP,既然是TCP就要涉及到IO,既然涉及到了IO就要涉及到IO的优化当然这些都是优化层面。基础层面来说,一旦一个TCP连接建立起来之后,客户端就需要建立一个一个Channel ,每个Channel 会被指派一个唯一的ID,Channel建立在Connection之上的虚连接,RabbitMQ的所有的消息都是通过Channel来完成的,如果每一次消息通信都需要重新开启或者关闭TCP连接,在一定程度上增加了系统资源的消耗。所以RabbitMQ采用了Channel这样的方式来进行连接的优化。而这里所说的唯一的ID,就类似于选择器中的SelectorKey。

  通过NIO的方式实现TCP连接复用,在一定程度上可以减少系统开销,也便于管理。这里采用了NIO,关于NIO的概念在之前的博客中有分享过,如果明确了NIO的一些概念之后就可以很好的理解连接复用技术。
在这里插入图片描述
  每个线程把池一个Channel,所以Channel复用了Connection的TCP连接,同时RabbitMQ 可以确保每个线程的私密性,就像是独立的连接一样。当每个Channel的流量不是很大的时候,复用单一的Connection可以在产生性能瓶颈的情况下有效地节省TCP连接资源。

  但是同样也会产生一个新的问题,就是,当复用信道本身的流量较大的时候,对性能也是一种消耗,这个时候就产生多个信道复用一个Connection所产生的瓶颈,导致整体的流量收到限制。这个时候就需要开辟多个Connection,将这些Channel按照一定的规则分别安排到这些Connection中,这个时候就需要一个叫做选择器的东西,当然这是NIO中的一些概念。有兴趣的可以了解NIO有关的概念。

  Channel在AMQP中是一个比较重要的概念,大多数的操作都是在这个层面进行展开的。在代码中可以看到对于Channel的命名方式,都是对于Channel进行标识的,这样在一定程度上可以高效的区分Channel的功能、合理的将AMQP中的配置与Channel进行绑定操作。在后面的分享中也会有具体的操作。

AMQP协议介绍

  上面的内容提到了,RabbitMQ应该遵从的是AMQP(高级消息队列)协议,也就是说RabbitMQ其实是AMQP的Erlang实现。当然RabbitMQ所能支持的并不是AMQP一个协议。AMQP的模型架构与RabbitMQ的模型架构是一样的,生产者将消息发送给交换器,交换器和队列进行绑定,当生产者发送消息的时候携带的路由键和绑定键相互匹配的时候,消息就会被存入该队列中,消费者可以通过订阅该队列进行消息获取。

  在之前的分享中提到了RabbitMQ中的交换器、交换器类型、队列、绑定、路由键等都是遵守AMQP协议中响应的概念,也就是说RabbitMQ默认支持AMQP最新版本。

AMQP协议

  AMQP协议本省包括三层内容

  • Module Layer 位于协议的最高层,主要是定义了一些提供客户端调用的命令,客户端可以使用这些命令进行实现自己的业务逻辑,例如消息的订阅、消息的消费者指定等等
  • Session Layer 位于中间层级,主要内容是负责将客户端的命令发送到服务器,再将服务器的应答信息发送到客户端,主要是提供客户端与服务器之间的应答请求机制。
  • Transport Layer 位于最底层,主要就是利用底层IO进行数据的传递,包括数据的校验、信道复用、数据表示等等。

  其实上面还提到的一个概念,就是AMQP底层还就是一个通信协议,一个通信协议会涉及到报文转化、数据传递等等内容。从最底层来看,AMQP本身是应用层的协议,填充了有关TCP相关的数据部分。从高层来看AMQP又是通过命令进行交互,这个有点类似于HTTP的四种请求方式一样。

总结

  上面的内容对RabbitMQ的运转流程做了详细的说明,同时提到了NIO的概念,希望有兴趣的读者可以看看笔者之前分享的关于Linux IO模型的有关知识,了解关于NIO的相关概念。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nihui123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值