RabbitMQ 交换机与绑定

交换机(Exchange)是 RabbitMQ 路由的核心:生产者只把消息发给交换机,由交换机决定放进哪个(些)队列;而这个"决定"所依据的规则,就是绑定(Binding)。本章总览交换机类型与绑定语法,后续三章逐个实战。

交换机的类型

交换机四类型路由语义 按路由规则,交换机分四类,另有一个系统自带的"默认交换机":

类型匹配规则用途章节
direct 直连routing key 与 binding key 全等精确路由第 8 章
fanout 扇形忽略 key,复制给所有绑定队列广播第 9 章
topic 主题通配符 * 与 # 按模式匹配模式路由第 10 章
headers 头按消息 headers 键值对匹配多条件路由第 11 章

另有默认交换机(Default Exchange):名字为空、类型 direct,每个队列都会自动绑上去,binding key 就是队列名。因此第 6 章"routing_key 填队列名"就能把消息直接送进对应队列,本质就是走了默认交换机。

交换机的属性

声明交换机与声明队列类似,常用属性有两个:durable 是否持久(true 则重启后保留,生产必开)、auto-delete 是否在最后一个绑定解除后自动删除。交换机名称在同一 vhost 内唯一。

绑定(Binding)

绑定 = 把交换机与队列(或另一个交换机)关联起来,并附上一个 binding key 作为匹配依据:

绑定关系:Exchange ──(binding key: xxx)──► Queue

消息路由时:
① 消息携带 routing key 进入交换机
② 交换机拿 routing key 与本交换机所有绑定的 binding key 比对
③ 命中的绑定 → 复制一份消息进对应队列(命中几条复制几份)

任何绑定都没命中的消息会被直接丢弃(默认配置下,见第 16 章死信)。同一个队列可以绑到多个交换机,一个交换机也可以绑多个队列,组合非常自由。

声明交换机 / 绑定 / 解绑

管理插件提供的 rabbitmqadmin 与网页控制台都能建,rabbitmqadmin 示例:

rabbitmqadmin declare exchange name=logs type=fanout durable=true
# 输出:exchange declared
rabbitmqadmin declare queue name=q1 durable=true
rabbitmqadmin declare binding source=logs destination_type=queue destination=q1 routing_key=""
# 输出:binding declared

代码里声明与解绑更常用(Java 片段,需放进 main 方法中运行):

channel.exchangeDeclare("logs", "fanout", true);   // 声明 durable 的 fanout 交换机
channel.queueDeclare("q1", true, false, false, null);  // 声明持久队列
channel.queueBind("q1", "logs", "");               // 把 q1 绑到 logs
channel.queueUnbind("q1", "logs", "");             // 解除绑定

查看与删除

sudo rabbitmqctl list_exchanges name type durable          # 列出全部交换机
sudo rabbitmqctl list_bindings source_name destination_name routing_key
rabbitmqadmin delete binding source=logs destination_type=queue destination=q1 routing_key=""
rabbitmqadmin delete queue name=q1
rabbitmqadmin delete exchange name=logs

小结

路由心智模型建立完毕:交换机按类型解释路由键,绑定把交换机与队列连起来并给出匹配规则,消息命中几条绑定就复制几份。direct/fanout/topic 的实战接下来三章逐个拆解,headers 留到第 11 章。

笔记加载中…