本文目录导读:

RabbitMQ的路由模式(Routing)中,精确匹配键是指交换机的类型为 direct,routing key(路由键)必须完全一致才能将消息路由到对应的队列。
以下是详细说明:
核心概念
- 交换机类型:
direct - 绑定:队列通过一个 精确的字符串 绑定到交换机。
- 路由规则:消息的
routing key必须与队列绑定的routing key完全相等,消息才会被路由到该队列。
工作流程图解
Producer
|
| 发送消息 (routing_key = "error")
|
[Direct Exchange]
|
/ | \
匹配? 匹配? 匹配?
| | |
Queue_A Queue_B Queue_C
(rk=info) (rk=error) (rk=warning)
结果:只有 Queue_B 收到消息
代码示例
1 定义交换机和队列(服务端/管理端)
假设我们需要一个日志系统,根据日志级别分发:
- 交换机:
direct_logs(类型:direct) - 队列A:
q_info(绑定键:info) - 队列B:
q_error(绑定键:error) - 队列C:
q_debug(绑定键:debug)
2 生产者代码(Python + pika)
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
# 1. 声明交换机,类型为 'direct'
channel.exchange_declare(exchange='direct_logs', exchange_type='direct')
# 2. 发送消息,指定精确的 routing_key
routing_key = 'error' # 只有绑定键为 'error' 的队列能收到
message = 'Critical error occurred!'
channel.basic_publish(
exchange='direct_logs',
routing_key=routing_key, # 这里是精确匹配的关键
body=message
)
print(f" [x] Sent '{routing_key}':'{message}'")
connection.close()
3 消费者代码(绑定到特定路由键)
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
# 1. 声明同一交换机
channel.exchange_declare(exchange='direct_logs', exchange_type='direct')
# 2. 创建临时队列(或持久队列)
result = channel.queue_declare(queue='', exclusive=True)
queue_name = result.method.queue
# 3. 绑定队列到交换机,并指定精确的 routing_key
severity = 'error' # 这个消费者只关心 error 级别
channel.queue_bind(
exchange='direct_logs',
queue=queue_name,
routing_key=severity # 精确绑定
)
print(f' [*] Waiting for logs with severity: {severity}. To exit press CTRL+C')
def callback(ch, method, properties, body):
print(f" [x] Received {method.routing_key}:{body}")
channel.basic_consume(queue=queue_name, on_message_callback=callback, auto_ack=True)
channel.start_consuming()
关键规则
-
完全一致:
routing_key必须是一个字符串,不能是正则或通配符(那是topic交换机做的事)。"apple"只能匹配绑定了"apple"的队列。"apple.red"只能匹配绑定了"apple.red"的队列,不能匹配"apple.*"。
-
多对多关系:
- 一个队列可以用多个不同的
routing_key绑定同一个交换机(如同时绑定"error"和"warning")。 - 多个队列可以用相同的
routing_key绑定(实现类似fanout的广播效果)。
- 一个队列可以用多个不同的
-
无匹配:如果消息的
routing_key没有绑定任何队列,消息会被丢弃。
与其它模式的对比
| 模式 | 交换机类型 | 路由键规则 |
|---|---|---|
| 简单/工作队列 | (默认) | 队列名就是路由键(隐式绑定) |
| 发布/订阅 | fanout |
忽略路由键,广播给所有队列 |
| 路由(精确匹配) | direct |
完全匹配 routing_key |
| 主题(模糊匹配) | topic |
通配符匹配 ( 匹配一个词, 匹配零个或多个词) |
RabbitMQ路由模式(direct 交换机)下的精确匹配,意味着:
消息的
routing key必须 100% 等于队列绑定的routing key,才能完成路由。