RabbitMQ基础知识了解

​ 公司前一段时间重构了一个老项目的代码,转为了SpringBoot,但是中间RabbitMQ在转换的时候我问了大佬一个很弱智的问题,所以抽了空,了解一下这个之前一直用但是不懂原理的中间件。

​ RabbitMQ是基于AMQP(高级消息队列协议)开发的一个消息队列产品,相当于一个软件,所以其实要讲的AMQP,下面也就简单介绍一下AMQP,然后在介绍中间的一些组件。

​ AMQP高级消息队列协议)是一种消息传递协议,使一致的客户端应用程序可以与一致的消息传递中间件代理进行通信。消息发布到exchanges(交换机),交换机类似于邮局或邮箱。然后,交换机使用称为bindings(绑定)的规则将消息副本分发到队列中。然后,代理要么将消息传递给订阅了队列的消费者,要么消费者按需从队列中获取/拉取消息。这就是AMQP的一些基础概念,下面就来一一叙述中间提及到的概念。概念如下图:

RabbitMQ基础知识了解

交换机

​ 交换机是接收消息的AMQP中的一种实体。交换记接收一条消息并将其路由到零个或多个队列中。使用的路由算法取决于交换机的类型和绑定的规则。交换机在RabbitMQ官网上只有四种,但是实际使用中还多了一个默认的类型。四种交换机名称分别为:Direct exchange(直接交换)、Fanout exchange(扇形交换)、Topic exchange(主题交换)、Headers exchange(标头交换)。下面就说说实际使用到的五种交换。

  • 默认交换。默认交换是一种特殊的直接交换,特殊的地方在于:默认交换是预先声明的不带名称(空字符串)的直接交换。创建的每个队列都使用与队列名称相同的路由自动绑定到该队列。举个例子,有一个队列声明为:“search-indexing-online”,那么使用路由关键字"search-indexing-online"发送到默认交换机的消息将会被队列"search-indexing-online"接收。看起来类似于直接将消息发送到队列中。
  • 直接交换。直接交换是基于消息路由关键字将消息传递到队列,原理也比较容易理解:队列使用路由关键字绑定到交换机,收到消息后,如果消息的路由关键字和前面的关键字一致,该消息就会路由到该队列。需要注意的是,如果有多个消费者接收同一个队列,那么将会在消费者层面进行负载均衡,而不是队列。示意图如下:

RabbitMQ基础知识了解

  • 扇形交换。扇形交换将消息路由到与其绑定的所有队列,并且路由关键字将被忽略。如果将N个队列绑定到扇形交换的交换机,则将新消息发布到该交换机时,会将消息的副本传递到所有N个队列。扇出交换机非常适合消息的广播路由。示意图如下:

RabbitMQ基础知识了解

  • 主题交换。主题交换根据消息的路由关键字和一个匹配规则将消息路由到一个或多个队列。主题交换类型通常用于实现各种发布/订阅模式变体。类似于MQTT中主题的概念,订阅了这个主题的客户端都可以接收到此类消息。没有示意图。
  • 标头交换。标头交换旨在用于在多个属性上进行路由,这些属性比路由键更容易表示为消息标头。标头交换忽略路由键属性。相反,用于路由的属性取自headers属性。如果标头的值等于绑定时指定的值,则认为消息匹配。

队列

​ AMQP中队列的概念和其他协议中队列的概念一致,存储由应用程序使用的消息。队列的属性有一些不同于其他的,如下:

  • 名称

  • 持久(队列将在代理重新启动后幸存)

  • 独占(仅由一个连接使用,并且该连接关闭时队列将被删除)

  • 自动删除(至少有一个使用方的队列在最后一个使用方退订时被删除)

  • 参数(可选;由插件和特定于代理的功能使用,例如消息TTL,队列长度限制等)

    需要注意的是,队列必须要先声明再使用,声明这个工作没有定必须由谁做,消费者或者生产者都可以,最好是由谁最先使用谁创建。如果声明已经创建的队列,属性一致的话,声明无效;属性不一致的话,会报一个406的通道异常。

绑定

​ 绑定是交换机使用的规则之一,这个规则的作用就是将消息路由联系到队列。为了指示交换机E将消息路由到队列Q,必须将Q 绑定到E。绑定可能具有某些交换机类型使用的可选 路由键属性。路由键的目的是选择发布到交换机的某些消息以路由到绑定队列。换句话说,路由键就像一个过滤器。

消息的相关知识

​ broker(代理)将消息发送到应用程序之后(使用basic.deliverbasic.get-ok方法)。应用程序发送回确认之后(使用basic.ack方法)。前者称为自动确认模型,而后者称为显式确认模型。

​ 关于RabbitMQ或者AMQP的基础知识了解到这里就暂时差不多了,后续的学习需要更加深入。就这样吧,结束。

相关文章: