direct模式通过exchange、routing key与binding key三者严格等值匹配实现消息定向投递,仅当routing key与binding key完全相同时,消息才被转发至对应队列,支持一对一或一对多精准路由。

RabbitMQ 的 Direct 模式靠Exchange + Routing Key + Binding Key三者精确匹配来实现消息定向投递。它不是广播,也不是模糊匹配,而是“一对一”或“一对多”的严格等值路由——只有消息的 Routing Key 与队列绑定时指定的 Binding Key 完全一致,消息才会进入该队列。
核心机制:交换机如何做路由判断
Direct Exchange 的路由逻辑非常简单直接:
- 生产者发送消息时,必须指定一个 Routing Key(如
"error"、"info"、"email") - 每个队列在绑定到 Direct Exchange 时,必须声明一个 Binding Key(例如
queue-error绑定"error") - Exchange 收到消息后,只比对 Routing Key 和所有已绑定队列的 Binding Key ——完全相等才转发,否则丢弃(除非配置了 mandatory + return callback)
- 多个队列可以绑定相同的 Binding Key,此时消息会同时投递到所有匹配队列(类似 Fanout 行为)
关键操作步骤(以 Spring Boot 为例)
实际落地需完成四件事:声明 Exchange、声明 Queue、建立 Binding、发送/消费带 Key 的消息。
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
-
声明 Direct Exchange:类型为
ExchangeTypes.DIRECT,建议设durable=true确保重启不丢失 -
声明多个 Queue:例如
"log.error.queue"、"log.info.queue",均设为持久化 -
绑定并指定 Binding Key:
BindingBuilder.bind(queueError).to(directExchange).with("error");同理 info 队列绑定"info" -
发送时携带 Routing Key:用
RabbitTemplate.convertAndSend(exchangeName, "error", message)——第二个参数就是 Routing Key -
消费者监听指定队列即可:无需关心 Key,因为路由已在投递阶段完成;也可用
@RabbitListener(queues = "log.error.queue")直接监听
常见使用场景与注意事项
Direct 模式适合需要按类别、级别、模块等明确标签分流的业务。
-
典型场景:日志分级(error/info/warn 分发到不同处理队列)、订单状态变更(
"order.created"/"order.paid"路由到对应服务)、多通道通知(email/sms/app_push 各自绑定不同 Key) - Binding Key 区分大小写,且是字符串全匹配,不支持通配符(那是 Topic 模式的事)
-
未匹配的消息默认被丢弃,如需捕获异常路由,可开启
mandatory=true并配合ReturnCallback处理 -
不依赖队列名做路由,队列名可任意命名(如
"q1"),真正起作用的是 Binding Key
Python 或 Java 原生客户端要点
脱离 Spring Boot 时,手动操作更需注意协议细节:
- 创建 Exchange 时必须显式声明
exchange_type='direct' - 绑定队列用
channel.queue_bind(queue=..., exchange=..., routing_key="xxx"),这里的routing_key就是 Binding Key - 发送消息调用
channel.basic_publish(..., routing_key="error", ...),这个 routing_key 是生产者设定的 Routing Key - 务必确保 Exchange、Queue、Binding 三者都已存在,否则发送可能失败或静默丢弃










