很好的问题!先说结论:没有交换机,一条消息只能发给一个队列;有了交换机,一条消息可以同时发给多个队列。


没有交换机的问题

假设电商系统下了一个订单,需要同时通知三个服务:

下单 → 发短信通知用户
下单 → 扣减库存
下单 → 通知物流备货

如果没有交换机,生产者只能这样写:

// 要发三次,耦合严重
rabbitTemplate.convertAndSend("sms.queue", message);
rabbitTemplate.convertAndSend("stock.queue", message);
rabbitTemplate.convertAndSend("logistics.queue", message);

这样的问题很明显:生产者必须知道所有下游队列的名字,每次新增一个服务,就要改生产者代码,违背了解耦的初衷。


有了交换机之后

生产者只管把消息扔给交换机,完全不关心有几个消费者、队列叫什么名字

// 只发一次,不关心后面有几个队列
rabbitTemplate.convertAndSend("order.exchange", "", message);

交换机负责自动广播给所有绑定的队列:

order.exchange → sms.queue      → 短信服务消费
               → stock.queue    → 库存服务消费
               → logistics.queue → 物流服务消费

以后新增一个「积分服务」,只需要新建一个队列绑定到交换机,生产者代码一行都不用改


一句话总结

交换机解决的核心问题是:生产者不需要关心消息给谁,只管发;交换机负责按规则分发给所有需要的队列。

这正是 RabbitMQ 实现解耦的关键所在。你在黑马课程里接下来会学到 Fanout、Direct、Topic 三种交换机,分别对应「广播给所有人」、「精确匹配」、「模糊匹配」三种分发策略,都是围绕这个核心思想展开的!