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 模式