java中rabbitmq通过direct、topic、fanout和headers四类交换机适配不同路由场景:direct用于精确匹配,topic支持*和#通配符的层级模糊匹配,fanout实现无差别广播,headers则依据消息头键值对及x-match策略进行复杂判断。

Direct 交换机:适合精确分发
当消息目标明确、路由键固定且一一对应时,Direct 是首选。比如订单状态变更(order.paid、order.cancelled)分别投递到支付处理队列和取消处理队列。
- 绑定键必须与发送时的 routing key 完全一致
- 支持一对多(多个队列绑定相同 routing key),也支持一对一
- Spring AMQP 中用
DirectExchange声明,绑定时指定具体字符串,如"order.paid"
Topic 交换机:适合语义化模糊匹配
当业务需要按层级结构做灵活过滤,比如“所有支付相关消息”或“某个模块下的所有成功事件”,Topic 就非常合适。它靠 *(单词)和 #(多单词)实现路径式匹配。
- routing key 和 binding key 都要用点号(.)分隔,例如
user.profile.updated -
user.*.updated匹配user.info.updated,但不匹配user.settings.security.updated -
user.#匹配user、user.login、user.profile.avatar.uploaded - 避免非法写法,如
#.payment或单独的*
Fanout 交换机:适合无差别广播
当一条消息需要被多个下游系统同时消费,且不关心内容细节时,Fanout 最省事。典型如日志归档、缓存失效通知、用户注册后触发多服务初始化。
- 完全忽略 routing key,所有绑定队列都会收到消息
- 声明时无需绑定键,Spring 中
BindingBuilder.bind(queue).to(exchange)不调用with(...) - 性能高,适合高吞吐、低延迟的广播场景
Headers 交换机:适合基于消息属性的复杂判断
当路由依据不是字符串路径,而是消息头里的多个字段组合(比如 type=invoice 且 env=prod),Headers 交换机就派上用场。它不依赖 routing key,靠 headers 键值对 + x-match=all/any 规则匹配。
- 发送方需设置
MessageProperties的 headers,如props.setHeader("type", "invoice") - 绑定时指定
headersMap 和x-match策略 - 使用频率较低,但对规则复杂的风控、审计类场景很实用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











