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 章。