RabbitMQ Routing路由模式详解
1. 核心概念
Routing 模式是 RabbitMQ 中 Direct Exchange(直连交换机) 的使用方式,它实现了 精确匹配 的消息路由机制。
关键要素:
- Exchange Type:
direct - 路由规则: Binding Key(绑定键)与 Routing Key(路由键)完全相等时才投递消息
- 特点: 一对一或一对多精确分发,不广播
2. 工作原理图解
生产者 ──→ Exchange (direct) ──→ Queue
Routing Key Binding Key 是否投递?
───────── ───────── ────────
"order.create" "order.create" ✅ 匹配
"order.create" "order.delete" ❌ 不匹配
"payment" "payment" ✅ 匹配
"payment" "payment*" ❌ 不支持通配符!
3. 与Fanout/Topic 模式对比
| 特性 | Fanout(发布订阅) | Routing(直连) | Topic(主题) |
|---|---|---|---|
| Exchange 类型 | fanout |
direct |
topic |
| 路由规则 | 无 Key,广播给所有队列 | 精确匹配 Routing Key = Binding Key | 通配符匹配 (* 单词, # 多词) |
| 匹配方式 | 全部匹配 | 完全相等 | 模式匹配 |
| 灵活性 | 低 | 中 | 高 |
| 适用场景 | 日志广播、通知群发 | 按优先级/类型路由 | 多级分类路由 |
| 通配符支持 | ❌ | ❌ | ✅ (*, #) |
4. 典型应用场景
场景一:按消息优先级路由
生产者发送消息,携带 routing_key: "high" / "medium" / "low"
↓
Direct Exchange
/ | \
v v v
HighQueue MediumQueue LowQueue
(只收high) (收medium) (收low)
场景二:按业务模块路由
routing_key: "user.register" → UserQueue
routing_key: "user.login" → AuthQueue
routing_key: "user.profile" → ProfileQueue
场景三:一个队列绑定多个 key
Direct Exchange
├── Binding Key: "order.create" → OrderQueue
├── Binding Key: "order.update" → OrderQueue
└── Binding Key: "order.cancel" → OrderQueue
(OrderQueue 会收到这三种 routing_key 的消息)
5. 注意事项
| 注意点 | 说明 |
|---|---|
| Binding Key 为空 | 如果队列绑定时的 Binding Key 为空字符串 "",Direct Exchange 行为退化为 Fanout,广播给所有队列 |
| Routing Key 未匹配 | 如果发送的消息 routing_key 没有任何队列绑定,消息会被 丢弃(除非设置了 mandatory=true,则会返回给生产者) |
| 不支持通配符 | direct 类型只支持精确匹配,不需要模糊匹配时不要用 topic 来凑合 |
| 多队列同 key | 多个队列可以绑定同一个 Binding Key,消息会同时投递给所有匹配的队列(一对多) |
| 性能 | 精确匹配比 Topic 的模式匹配更快,CPU 开销更低 |
6. 什么时候选 Routing?
- ✅ 需要按 明确类型/级别/模块 精确分发消息
- ✅ 路由规则简单,不需要通配符
- ✅ 性能要求高,精确匹配开销最小
- ❌ 如果需要模糊匹配 → 改用 Topic 模式
- ❌ 如果需要广播给所有 → 改用 Fanout 模式