rabbitmq的exchange有四种类型:direct精确匹配routing key;fanout广播忽略routing key;topic通过*和#通配符模式匹配;headers依据消息头键值对匹配,日常多用topic。

RabbitMQ 中的 Exchange(交换机)是消息路由的核心,生产者不直接发消息到队列,而是先发给 Exchange,再由它按规则分发。Java 客户端(如 Spring AMQP 或原生 RabbitMQ Java Client)中,Exchange 类型决定了消息如何分配到队列,主要靠 路由键(Routing Key) 和 绑定键(Binding Key) 的匹配逻辑来实现。
Direct Exchange:精确匹配分配
消息只发给 Binding Key 与 Routing Key 完全一致的队列。
- 一个队列可绑定多个 Routing Key(比如绑定 "error" 和 "warn")
- 一个 Routing Key 也可被多个队列绑定(比如两个队列都绑了 "info")
- 发送时必须指定非空 Routing Key,否则会被丢弃
- 适合任务分类明确、点对点投递场景,如日志级别分发、订单状态通知
Fanout Exchange:广播式分配
忽略 Routing Key,把消息无差别发给所有绑定的队列。
- 声明时类型设为 "fanout",绑定队列时 Binding Key 可任意填写(实际被忽略)
- 发送时 Routing Key 必须为空字符串("")或 null
- 性能最高,适合通知类、刷新类广播场景,如配置变更推送、缓存清空指令
Topic Exchange:模式匹配分配
用通配符做模糊匹配:* 匹配单个单词,# 匹配零个或多个单词,以 . 分隔。
- 队列绑定时使用 Binding Key 模式(如 "user.*"、"order.#")
- 消息发送时携带 Routing Key(如 "user.create"、"order.pay.success")
- 匹配成功即投递,一个消息可能被多个队列接收
- 适合多维度、可扩展的路由场景,如微服务间事件总线、多租户消息隔离
Headers Exchange:属性键值匹配分配(较少用)
不依赖 Routing Key,而是比对消息 Header 中的键值对是否满足绑定时设定的条件(如 x-match=all 或 any)。
- 配置较复杂,性能略低,一般用于需要多维元数据路由的特殊场景
- Java 中需设置 headers map,并在 binding 时声明匹配策略
- 日常开发中基本被 Topic 替代,除非有强 schema 匹配需求
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











