fanout交换机实现消息广播,将每条消息无差别转发给所有绑定队列,忽略routing key;声明时需指定type='fanout',绑定队列无需routing key,发送消息时routing key亦被忽略。

RabbitMQ 的 Fanout 交换机(Exchange)专为广播模式设计,它会把收到的每条消息无差别地转发给所有绑定到它的队列,不关心路由键(routing key),也不做任何匹配判断。
创建 Fanout 类型的 Exchange
在声明交换机时,必须指定类型为 fanout。这是实现广播的前提,其他类型(如 direct、topic)无法实现纯广播行为。
- 使用 RabbitMQ 官方客户端(如 Python 的 pika)时,调用
exchange_declare并传入exchange_type='fanout' - 通过管理界面创建时,在 “Exchanges” 页面点击 “Add a new exchange”,Type 选择 Fanout
- 命令行工具
rabbitmqadmin可执行:rabbitmqadmin declare exchange name=my_fanout type=fanout
绑定多个队列到同一个 Fanout Exchange
Fanout 的核心机制是“一对多”广播,因此需将多个队列分别绑定(bind)到该交换机。绑定时无需指定 routing key(即使指定也会被忽略)。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 每个队列调用
queue_bind,目标 exchange 为 fanout 交换机,routing key 参数可留空或设为任意字符串(例如 '' 或 'ignored') - 多个消费者可各自声明专属队列并绑定,实现消息的并行消费与解耦
- 示例场景:订单服务发一条“订单已创建”通知,用户服务、库存服务、日志服务各自监听对应队列,互不影响
发布消息时不设置 routing key
向 Fanout Exchange 发送消息时,routing key 被完全忽略。只要 exchange 存在且有绑定队列,消息就会被复制并投递到所有绑定队列。
- 生产者调用
basic_publish时,routing_key参数可为空字符串('')或任意值(如'any'),效果相同 - 消息体(body)和属性(如 delivery_mode)照常设置,Fanout 不修改这些内容
- 注意:若没有任何队列绑定到该 Fanout Exchange,消息会被直接丢弃(除非设置了备用交换机)
验证广播是否生效
可通过 RabbitMQ 管理界面或命令行观察实际投递情况,确保逻辑符合预期。
- 进入管理界面的 “Queues” 页面,查看各队列的 “Ready” 和 “Unacknowledged” 消息数是否同步增长
- 使用
rabbitmqctl list_bindings查看该 Fanout Exchange 绑定了哪些队列 - 启动多个消费者分别监听不同队列,发送一条消息后确认每个消费者都收到了副本










