RabbitMQ交换机与队列研究

本文详细介绍了RabbitMQ中的四种主要交换机类型:直连交换机、扇型交换机、主题交换机和头交换机,以及特殊类型的死信交换机。探讨了它们的工作原理、绑定规则和消息路由策略,帮助理解如何有效利用RabbitMQ进行消息传递。

一、交换机

交换机主要包括如下4种类型:
Direct exchange(直连交换机)
Fanout exchange(扇型交换机)
Topic exchange(主题交换机)
Headers exchange(头交换机)

另外RabbitMQ默认定义了一些交换机:
默认交换机
amq.* exchanges

还有一类特殊的交换机:Dead Letter Exchange(死信交换机)

1.1 Direct exchange(直连交换机)

将消息的routing key与队列的binding key进行精确匹配,匹配上则发送到相应队列,可以发送到多个队列,若无匹配,则转发队列失败。

1.2 Fanout exchange(扇型交换机)

将消息发送到所有队列,不会计算消息的routing key与队列的binding key是否匹配。

1.3 Topic exchange(主题交换机)

将消息的routing key与队列的binding key进行模糊匹配,匹配上则发送到相应队列,可以发送到多个队列,若无匹配,则转发队列失败。

binding key支持*和#,*只能匹配一个词,#可以匹配多个词。

例如:
order.*可以匹配order.123456,不能匹配order.cancel.123456
order.#可以匹配order.123456order.cancel.123456

说明:以上例子order.*是binding key,order.123456是routing key

1.4 Headers exchange(头交换机)

不处理路由键,而是根据发送的消息内容中的headers属性进行匹配。在绑定Queue与Exchange时指定一组键值对;当消息发送到RabbitMQ时会取到该消息的headers与Exchange绑定时指定的键值对进行匹配;如果完全匹配则消息会路由到该队列,否则不会路由到该队列。headers属性是一个键值对,可以是HashTable,键值对的值可以是任何类型。而fanout,direct,topic 的路由键都需要要字符串形式的。

匹配规则x-match有下列两种类型:
x-match = all :表示所有的键值对都匹配才能接受到消息
x-match = any :表示只要有键值对匹配就能接受到消息

1.5 其它交换机

在RabbitMQ默认定义一些交换机,主要如下:

1.5.1 默认交换机

默认交换机(default exchange)实际上是一个由RabbitMQ预先声明好的名字为空字符串的直连交换机(direct exchange)。它有一个特殊的属性使得它对于简单应用特别有用处:那就是每个新建队列(queue)都会自动绑定到默认交换机上,绑定的路由键(routing key)名称与队列名称相同。

如:当你声明了一个名为”hello”的队列,RabbitMQ会自动将其绑定到默认交换机上,绑定(binding)的路由键名称也是为”hello”。因此,当携带着名为”hello”的路由键的消息被发送到默认交换机的时候,此消息会被默认交换机路由至名为”hello”的队列中。即默认交换机看起来貌似能够直接将消息投递给队列,如同我们之前文章里看到一例子。

1.5.2 amq.*的名称的交换机

这些是RabbitMQ默认创建的交换机。这些队列名称被预留做RabbitMQ内部使用,不能被应用使用,否则抛出403 (ACCESS_REFUSED)错误

1.5.3 Dead Letter Exchange(死信交换机)

在默认情况,如果消息在投递到交换机时,交换机发现此消息没有匹配的队列,则这个消息将被悄悄丢弃。为了解决这个问题,RabbitMQ中有一种交换机叫死信交换机。当消费者不能处理接收到的消息时,将这个消息重新发布到另外一个队列中,等待重试或者人工干预。这个过程中的exchange和queue就是所谓的”Dead Letter Exchange 和 Queue”

1.5.4 交换机的属性

除交换机类型外,在声明交换机时还可以附带许多其他的属性,其中最重要的几个分别是:

Name:交换机名称
Durability:是否持久化。如果持久性,则RabbitMQ重启后,交换机还存在
Auto-delete:当所有与之绑定的消息队列都完成了对此交换机的使用后,删掉它
Arguments:扩展参数

二、队列

队列绑定到交换机上,可以设置一个binding key,也可以不设置。

  • 当不设置binding key时,若队列绑定到直连交换机或主题交换机,那么生产者发送消息时不设置routing key,才能收到消息。

  • 当设置binding key时,若队列绑定到直连交换机或主题交换机,那么生产者发送消息时需要设置routing key,且被binding key匹配上,才能收到消息。

  • 当队列绑定到扇形交换机,队列的binding key与消息的routing key无效,不管队列是否设置binding key和生产者是否设置routing key,生产者发送到扇形交换机的消息,队列都能收到。

三、消费者

消费者绑定到某个队列上,当有多个消费者绑定同一队列时,会使用轮循的方式将消息分发给各消费者。

四、生产者

生产者往交换机发送消息,可附带一个routing key,也可以不带。

  • 发送消息到直连交换机时,不带routing key,消息只会转发到未设置binding key的队列;带了routing key,消息只会转发到设置了相同binding key的队列。

  • 发送消息到扇形交换机时,带不带routing key,消息都会转发给所有队列。

  • 发送消息到主题交换机时,不带routing key,消息只会转发到未设置binding key的队列;带了routing key,消息会按照routing key转发被binding key匹配的队列。一般binding key是一个模糊匹配表达式(如:order.*,order.#),routing key是一个精确值(如:order.123456,order.cancel.123456)

参考资料

  1. 中间件系列三 RabbitMQ之交换机的四种类型和属性
### RabbitMQ 交换机队列的工作原理 #### 交换机 (Exchange) 在 RabbitMQ 中,交换机负责接收生产者发送的消息并将这些消息路由到一个或多个队列交换机本身并不存储消息;它的主要职责是根据特定的规则将消息分发给合适的队列。 不同的交换机类型决定了如何处理接收到的消息: - **Direct Exchange**: 路由键完全匹配的情况下才会转发消息至对应的队列。 - **Fanout Exchange**: 不考虑路由键,广播方式向所有绑定此交换机队列复制一份消息[^4]。 - **Topic Exchange**: 支持通配符模式匹配的方式决定哪些队列应该接受某条消息。 - **Headers Exchange**: 基于消息头属性而不是路由键来选择目标队列。 #### 队列 (Queue) 队列是用来保存等待被消费的消息集合。当消费者连接上之后就可以从中取出并处理消息。为了增强系统的可靠性可用性,可以设置 `durable` 参数使队列成为持久化的,在服务器重启后仍然存在[^2]。 #### 绑定关系 (Binding) 通过定义 binding 可以建立 exchange queue 间的关联,即指定某个具体的 exchange 应该怎样将消息投递给哪个 queue。这通常涉及到提供一个 routing key 或其他条件作为筛选依据。例如,使用 Java 客户端库时可以通过如下代码实现绑定操作: ```java channel.queueBind(queueName, EXCHANGE_NAME, RouterKey); ``` 这里 `(queueName, EXCHANGE_NAME, RouterKey)` 分别代表要绑定的目标队列名称、源交换机名以及可选的路由关键字[^3]。 --- ### 配置方法 对于 Spring Boot 应用程序来说,借助 spring-boot-starter-amqp 自动化配置功能能够轻松完成对 RabbitMQ 的初始化工作,包括但不限于声明必要的 exchanges、queues bindings 等资源对象[^1]。 具体而言,在 application.yml 文件内添加类似下面的内容即可满足基本需求: ```yaml spring: rabbitmq: host: localhost port: 5672 username: guest password: guest rabbitmq: queues: myQueue: name: 'my_queue' durable: true exchanges: myExchange: type: fanout name: 'my_exchange' bindings: - destination: myQueue source: myExchange key: '' ``` 上述 YAML 片段展示了如何利用应用程序属性文件快速搭建起一套简单的消息传递基础设施框架——创建了一个名为 "my_exchange" 的扇形交换器,并将其同样具有持久性的 "my_queue" 进行了无条件绑定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值