本文目录导读:

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,才能完成路由。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播