RabbitMQ 之 Exchange
摘要
-
本文介绍 RabbitMQ 的 Exchange 的基本概念和用法。
-
本文使用的 RabbitMQ 版本为 4.1.4。
Exchange(交换机) 是什么?
-
在 RabbitMQ 中,Exchange(交换机) 是消息路由的核心组件。它负责接收生产者发送的消息,并根据预定义的路由规则将消息转发到一个或多个队列。
-
Exchange 类型决定了消息的路由方式。RabbitMQ 支持的 Exchange 类型
Exchange 类型 | 声明类型 | 路由规则描述 | 典型用途 |
---|---|---|---|
Direct | direct |
消息根据 路由键(routing key) 精确匹配绑定键(binding key)进行路由。 | 精确消息传递,如日志分类、任务分发等。 |
Fanout | fanout |
消息广播到所有绑定的队列,忽略路由键。 | 广播消息,如发布/订阅模式、实时通知等。 |
Topic | topic |
消息根据路由键与绑定键模式的匹配进行路由,支持通配符 * (匹配一个词)和 # (匹配零个或多个词)。 |
模块化路由,如日志系统、事件驱动架构等。 |
Headers | headers |
消息根据 消息头部(headers) 与绑定时指定的头部匹配进行路由,支持 x-match 参数(any 或 all )。 |
多条件路由,如复杂过滤、动态路由等。 |
Local Random Exchange | x-local-random |
消息始终被路由到本地队列,如果有多个本地队列绑定,则随机选择一个进行投递。 | 请求-响应(RPC)模式,低延迟通信 |
-
RabbitMQ 默认为我们提供了如下的交换机
-
每新创建一个 Vhost,RabbitMQ 就会自动创建以下交换机,比如
/vtest
-
当然我们也可以根据需要创建新的交换机
-
配置说明
- Durability: 指定 Exchange 是否持久化。
- Durable: 持久化的 Exchange 会被保存在磁盘上,重启 RabbitMQ 时会自动恢复。
- Transient: 非持久化的 Exchange 会被保存在内存中,重启 RabbitMQ 时会丢失。
- Auto-delete: 指定 Exchange 是否自动删除。
- yes: 如果没有队列或交换机绑定该 Exchange,则该 Exchange 会自动删除。
- no: 该 Exchange 不会自动删除。
- Internal: 用于控制交换机是否可以被生产者直接发布消息
- yes: 不能被生产者直接发送消息,该交换机只能用于 将消息从其他交换机转发到该交换机。
- no: 可以被生产者直接发送消息。
- Arguments: 用于设置 Exchange 的其他参数,目前仅支持一个参数
- Alternate exchange(alternate-exchange): 指定该 Exchange 的备用交换机,如果无法以其他方式将发往此交换机的消息路由出去,则将它们发送至此处指定的备用交换机。
- Durability: 指定 Exchange 是否持久化。
Direct Exchange(直接交换机)
-
路由规则:消息的路由键与队列的绑定键完全匹配时,消息被路由到该队列。
-
示例:如果队列绑定键为 error,则只有路由键为 error 的消息会被路由到该队列。
-
适用场景:需要精确匹配的场景,如日志分类、任务分发等。
Fanout Exchange(扇出交换机)
-
路由规则:消息广播到所有绑定的队列,忽略路由键。
-
示例:无论消息的路由键是什么,都会被路由到所有绑定的队列。
-
适用场景:广播消息,如发布/订阅模式、实时通知等。
Topic Exchange(主题交换机)
-
路由规则:消息的路由键与队列的绑定键模式匹配时,消息被路由到该队列。支持通配符 *(匹配一个词)和 #(匹配零个或多个词)。
-
示例:如果队列绑定键为 .orange.,则路由键为 quick.orange.rabbit 的消息会被路由到该队列。
-
适用场景:模块化路由,如日志系统、事件驱动架构等。
Headers Exchange(头部交换机)
-
路由规则:消息的头部与队列的绑定头部匹配时,消息被路由到该队列。支持 x-match 参数(any 或 all)。即使配置了路由键也会忽略。
-
示例:如果队列绑定头部为 { “x-match”: “all”, “format”: “pdf”, “priority”: “high” },则只有同时满足这两个条件的消息会被路由到该队列。
-
适用场景:多条件路由,如复杂过滤、动态路由等。
Local Random Exchange(本地随机交换机)
-
Local Random Exchange 是 RabbitMQ 4.0 引入的交换机类型,旨在优化
请求-响应
模式下的消息路由,特别适用于低延迟和高吞吐量的场景。通过结合独占队列使用,可以确保消息快速传递到本地消费者,减少网络延迟,提高系统性能。 -
路由规则:消息始终被路由到本地队列(位于同一节点上),如果有多个本地队列绑定,则随机选择一个进行投递。
-
示例:假设节点 A 上有两个绑定了 x-local-random 交换机的队列 Q1 和 Q2,发布的消息会随机路由到 Q1 或 Q2,但不会路由到其他节点的队列。
-
适用场景:请求-响应(RPC)模式下的低延迟通信,适合微服务架构中每个节点上都有消费者的场景。
-
在使用 Local Random Exchange 时,必须满足以下条件:
- 独占队列:消费者应声明独占队列,以确保队列仅绑定到当前节点。
- 每个节点至少一个消费者:每个 RabbitMQ 节点上应至少有一个消费者,否则在该节点上发布的消息将被丢弃。
- 交换机类型声明:使用
x-local-random
类型声明交换机。
Exchange 与 Queue 绑定(Binding)
-
创建好 Exchange 之后,需要将 Exchange 与 Queue 绑定,才能将消息发送到指定的队列。
-
Exchange 与 Queue 的绑定关系,即 Exchange 发送的消息,会根据路由键与队列的绑定键进行匹配,如果匹配成功,则将消息发送到对应的队列。
-
在 Exchange 页面点击 Exchange 的名称,进入 Exchange 详情页面,此处可以进行 Exchange 与 Queue 绑定配置
这里的
Arguments
用于设置 绑定 的其他参数,比如Headers Exchange
需要设置x-match
参数等。