RabbitMQ 直连交换机

direct(直连)交换机按"完全相等"路由:消息的 routing key 与绑定的 binding key 一模一样才投递,是最精确、也最好理解的一类交换机。

路由语义

direct 精确匹配路由 只有 binding key == routing key(区分大小写、逐字节相等)的绑定才会命中;一条消息可以被多个绑定同时命中,每个命中的队列各收一份:

Exchange: order.direct (direct)
消息 routing key = "order.created"
  ├─► 命中绑定 "order.created" → 投进 order.created.q
  └─✗ 不匹配绑定 "order.paid"  → 不投递

完整路由示例

假设订单服务发布两类事件:创建(order.created)与支付(order.paid)。用 Python pika 建两个队列、两条绑定,各收各的:

import pika
conn = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
ch = conn.channel()
ch.exchange_declare(exchange='order.direct', exchange_type='direct', durable=True)
# 队列 1:只关心创建事件
ch.queue_declare(queue='order.created.q', durable=True)
ch.queue_bind(queue='order.created.q', exchange='order.direct', routing_key='order.created')
# 队列 2:只关心支付事件
ch.queue_declare(queue='order.paid.q', durable=True)
ch.queue_bind(queue='order.paid.q', exchange='order.direct', routing_key='order.paid')
# 发布创建事件 → 只有 order.created.q 收到
ch.basic_publish(exchange='order.direct', routing_key='order.created', body=b'new order 1001')
print('已发布 order.created')                # 输出:已发布 order.created
conn.close()

多个队列绑同一个 key:一对多

若两个队列用同一个 binding key 绑到 direct 交换机,消息会同时进入两个队列(每队列一份),各自可有独立消费者,实现"广播"效果:

消息 order.created
  ├─► 绑定 "order.created" → 队列 A(库存预占)
  └─► 绑定 "order.created" → 队列 B(短信提醒)

反过来,多个生产者发同一个 key、只有一个队列绑它时,消息就在该队列的多个消费者之间轮询分发(负载均衡),这是最常见的 work queue 用法。

日志系统按级别分发

经典例子:服务把日志按级别(info/warn/error)路由到不同队列,error 队列可配专职处理:

rabbitmqadmin declare exchange name=log.direct type=direct durable=true
rabbitmqadmin declare queue name=q.info durable=true
rabbitmqadmin declare queue name=q.error durable=true
rabbitmqadmin declare binding source=log.direct destination_type=queue destination=q.info routing_key="info"
rabbitmqadmin declare binding source=log.direct destination_type=queue destination=q.error routing_key="error"
rabbitmqadmin declare binding source=log.direct destination_type=queue destination=q.error routing_key="warn"
# 发布 key=error 只进 q.error;key=info 只进 q.info
# q.error 绑了 error、warn 两个 key,所以两种级别它都收

想"同时收多个级别",就为队列多绑几个 key(如上例),direct 不做任何前缀/通配匹配。

适用场景

direct 适合"事件类型明确、能精确归类"的消息,例如:订单状态机事件(created/paid/shipped 各一个 key)、日志分级、支付回调按结果分发(success/fail)。当需要前缀或通配匹配时,改用第 10 章的主题交换机。

小结

direct 交换机 = binding key 与 routing key 全等匹配。一个 key 绑一个队列做负载均衡,多个队列绑同一个 key 就得到一对多广播。拿不准路由粒度时,先用 direct 把类型分清楚,再考虑升级成 topic。

笔记加载中…