RabbitMQ 交换机的路由规则
Mr.Lee 2026-03-31 00:00:23 RabbitMQ
RabbitMQ 中不同交换机的路由规则
在 RabbitMQ 中,这四种交换机(Exchange)的核心区别在于路由规则不同——即它们如何将消息从生产者路由到绑定的队列中。
以下是它们的具体功能、区别及使用场景:
# 1. Fanout(扇形交换机)
- 功能:这是最简单的模式。它会将收到的消息广播到所有绑定的队列中,完全忽略路由键(Routing Key)。
- 不同点:不进行任何匹配,只负责复制分发。
- 使用场景:
- 广播通知:比如用户登录后,需要同时更新缓存、发送欢迎邮件、记录日志。只需将消息发往 Fanout 交换机,所有下游系统都能同时收到。
- 多端同步:当需要所有微服务实例都刷新本地缓存时。
# 2. Direct(直连交换机)
- 功能:根据路由键(Routing Key)进行精确匹配。只有当消息的路由键与队列绑定的路由键完全一致时,消息才会被投递到该队列。
- 不同点:点对点、单播或多播的精确控制。
- 使用场景:
- 任务分发:比如有“处理订单”和“处理退款”两个队列。发送消息时,将路由键设为
order,消息只会进入订单处理队列;设为refund,则进入退款队列。 - 日志分级:将路由键设为
error、info、warning。只有绑定error的队列(如告警服务)能收到错误日志,而绑定info的队列(如归档服务)能收到所有日志(如果绑定了多个键)。
- 任务分发:比如有“处理订单”和“处理退款”两个队列。发送消息时,将路由键设为
# 3. Topic(主题交换机)
- 功能:类似于 Direct,但支持通配符模糊匹配。
*:匹配一个单词。#:匹配零个或多个单词。
- 不同点:具备 Direct 的精确性,同时兼顾了 Fanout 的灵活性,能实现复杂的规则。
- 使用场景:
- 多维度分类:假设消息的路由键格式为
品类.地区.级别(如电子产品.北京.紧急)。- 如果有一个队列只关心“北京的紧急订单”,可以绑定
*.北京.紧急。 - 如果有一个队列关心“所有电子产品相关”,可以绑定
电子产品.#。
- 如果有一个队列只关心“北京的紧急订单”,可以绑定
- 微服务事件驱动:当不同服务需要监听同一类事件的不同子集时(如
user.created、user.updated、order.paid),Topic 能非常灵活地进行订阅。
- 多维度分类:假设消息的路由键格式为
# 4. Headers(头交换机)
- 功能:忽略路由键,根据消息的 Headers 属性(键值对) 进行匹配。
- 不同点:它不依赖路由键字符串,而是依赖消息头中的一组键值对,支持
any(任意一个匹配)和all(全部匹配)两种匹配策略。 - 使用场景:
- 复杂路由逻辑:当路由条件无法用简单的字符串(如
direct)或带通配符的字符串(如topic)表达时。 - 元数据路由:例如,需要根据消息的“版本号”、“协议类型”、“加密方式”等多个动态属性来决定路由到哪个处理队列,而不是依靠固定的字符串。
- 复杂路由逻辑:当路由条件无法用简单的字符串(如
# 总结对比
| 类型 | 匹配依据 | 特点 | 类比 |
|---|---|---|---|
| Fanout | 无 | 广播,忽略路由键 | 微信群发消息,群里所有人都能看到 |
| Direct | Routing Key | 精确匹配字符串 | 快递单上的地址:门牌号必须精确匹配 |
| Topic | Routing Key | 通配符匹配 | 模糊搜索或订阅:*.浙江.# 匹配浙江所有市县 |
| Headers | 消息属性 | 匹配键值对,支持 any/all | 类似 HTTP 请求头路由,根据多个参数筛选 |
补充一点:在实际开发中,Topic 通常是使用频率最高的,因为它足够灵活;如果追求性能且路由规则简单,Direct 会更合适;如果完全不需要区分接收方,Fanout 最简洁;只有在路由逻辑非常复杂且依赖多个属性时,才考虑使用 Headers。