RabbitMQ路由模式精确匹配键

wen java案例 1

本文目录导读:

RabbitMQ路由模式精确匹配键

  1. 核心概念
  2. 工作流程图解
  3. 代码示例
  4. 关键规则
  5. 与其它模式的对比

RabbitMQ的路由模式(Routing)中,精确匹配键是指交换机的类型为 directrouting 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)
  • 队列Aq_info (绑定键:info)
  • 队列Bq_error (绑定键:error)
  • 队列Cq_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()

关键规则

  1. 完全一致routing_key 必须是一个字符串,不能是正则或通配符(那是 topic 交换机做的事)。

    • "apple" 只能匹配绑定了 "apple" 的队列。
    • "apple.red" 只能匹配绑定了 "apple.red" 的队列,不能匹配 "apple.*"
  2. 多对多关系

    • 一个队列可以用多个不同的 routing_key 绑定同一个交换机(如同时绑定 "error""warning")。
    • 多个队列可以用相同routing_key 绑定(实现类似 fanout 的广播效果)。
  3. 无匹配:如果消息的 routing_key 没有绑定任何队列,消息会被丢弃

与其它模式的对比

模式 交换机类型 路由键规则
简单/工作队列 (默认) 队列名就是路由键(隐式绑定)
发布/订阅 fanout 忽略路由键,广播给所有队列
路由(精确匹配) direct 完全匹配 routing_key
主题(模糊匹配) topic 通配符匹配 ( 匹配一个词, 匹配零个或多个词)

RabbitMQ路由模式(direct 交换机)下的精确匹配,意味着:

消息的 routing key 必须 100% 等于队列绑定的 routing key,才能完成路由。

抱歉,评论功能暂时关闭!