全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📅 2026-05-22 8 分钟 ✍️ juanwangdev

路由键 Routing Key

路由键是生产者发送消息时携带的标识符,交换机根据路由键与Binding Key的匹配结果决定消息转发目标。

基本概念

消息发送时指定路由键:

Java
channel.basicPublish(exchange, routingKey, properties, body);

交换机接收到消息后:

  1. 提取消息的Routing Key
  2. 遍历所有绑定的Binding Key
  3. 根据交换机类型执行匹配规则
  4. 将消息转发到匹配的队列

Direct交换机:精确匹配

Routing Key必须与Binding Key完全一致。

Java
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.BuiltinExchangeType;

public class RoutingKeyExample {
    private static final String EXCHANGE_NAME = "direct_exchange";
    private static final String QUEUE_A = "queue_a";
    private static final String QUEUE_B = "queue_b";

    public static void main(String[] args) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");

        try (Connection connection = factory.newConnection();
             Channel channel = connection.createChannel()) {

            // 声明直连交换机
            channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);

            // 声明两个队列
            channel.queueDeclare(QUEUE_A, true, false, false, null);
            channel.queueDeclare(QUEUE_B, true, false, false, null);

            // 绑定不同路由键
            channel.queueBind(QUEUE_A, EXCHANGE_NAME, "order.create");
            channel.queueBind(QUEUE_B, EXCHANGE_NAME, "order.delete");

            // 发送消息,routing key为 "order.create"
            channel.basicPublish(EXCHANGE_NAME, "order.create", null, "创建订单".getBytes("UTF-8"));

            // 该消息只会路由到 queue_a,不会到达 queue_b
            System.out.println("消息已发送,仅匹配 order.create 的队列会接收");
        }
    }
}

Topic交换机:模式匹配

支持通配符:

  • *:匹配一个单词(以 . 分隔)
  • #:匹配零个或多个单词
Java
// 声明主题交换机
channel.exchangeDeclare("topic_exchange", BuiltinExchangeType.TOPIC);

// 绑定模式
channel.queueBind("queue_logs", "topic_exchange", "*.log.*");      // 匹配任意.log.路由
channel.queueBind("queue_errors", "topic_exchange", "order.error.#");  // 匹配order.error.开头的所有路由

// 发送消息
channel.basicPublish("topic_exchange", "app.log.error", null, "错误日志".getBytes("UTF-8"));
// 匹配 queue_logs(*.log.* 匹配 "app.log.error")

channel.basicPublish("topic_exchange", "order.error.timeout", null, "订单错误".getBytes("UTF-8"));
// 同时匹配两个队列(order.error.# 匹配 "order.error.timeout")

路由键单词间必须用 . 分隔,如 user.login.success,使用其他分隔符会导致匹配失败。

注意事项

  1. 默认交换机(空字符串)下,Routing Key必须等于队列名称
  2. Direct交换机区分大小写,"Order.Create""order.create" 不匹配
  3. Topic交换机 # 可匹配零个单词,"order.#" 能匹配 "order" 本身
  4. Fanout交换机完全忽略路由键,所有绑定队列都会收到消息
  5. 路由键为空字符串也是合法的,但只会匹配Binding Key为空的绑定

要点总结

  • 路由键是消息发送时携带的标识,交换机根据其与Binding Key匹配决定转发目标
  • Direct交换机要求精确匹配,Routing Key必须等于Binding Key
  • Topic交换机支持通配符匹配,*匹配一个单词,#匹配零或多个单词
  • 路由键使用 . 分隔单词,匹配时区分大小写
  • 不同交换机类型下路由键的作用完全不同,需根据场景选择

文章存放路径:D:\git2\jwdev\articles\RABBITMQ\入门\核心概念入门\路由键 Routing Key.md

📝 发现内容有误?点击此处直接编辑

← 上一篇 虚拟主机 VHost
下一篇 → 连接 Connection 与通道 Channel
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库