路由键 Routing Key
路由键是生产者发送消息时携带的标识符,交换机根据路由键与Binding Key的匹配结果决定消息转发目标。
基本概念
消息发送时指定路由键:
Java
channel.basicPublish(exchange, routingKey, properties, body);
交换机接收到消息后:
- 提取消息的Routing Key
- 遍历所有绑定的Binding Key
- 根据交换机类型执行匹配规则
- 将消息转发到匹配的队列
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,使用其他分隔符会导致匹配失败。
注意事项
- 默认交换机(空字符串)下,Routing Key必须等于队列名称
- Direct交换机区分大小写,
"Order.Create"与"order.create"不匹配- Topic交换机
#可匹配零个单词,"order.#"能匹配"order"本身- Fanout交换机完全忽略路由键,所有绑定队列都会收到消息
- 路由键为空字符串也是合法的,但只会匹配Binding Key为空的绑定
要点总结
- 路由键是消息发送时携带的标识,交换机根据其与Binding Key匹配决定转发目标
- Direct交换机要求精确匹配,Routing Key必须等于Binding Key
- Topic交换机支持通配符匹配,
*匹配一个单词,#匹配零或多个单词 - 路由键使用
.分隔单词,匹配时区分大小写 - 不同交换机类型下路由键的作用完全不同,需根据场景选择
文章存放路径:D:\git2\jwdev\articles\RABBITMQ\入门\核心概念入门\路由键 Routing Key.md
📝 发现内容有误?点击此处直接编辑