怎么理解"扇出"

核心就一句话:把一份东西,原封不动地复制成多份,分发给多个下游。


        [ 输入 ]
           |
           | (一份数据)
           |
      ┌────┴────┐
      │ 扇出节点 │  (比如一个交换机,或者一个服务)
      └────┬────┘
           |
    ┌──────┼──────┐
    |      |      |
    | (复制) | (复制) | (复制)
    ↓      ↓      ↓
  [输出1] [输出2] [输出3]
  (下游A) (下游B) (下游C)

“扇出”这个词,其实就来源于扇子的形状:

  • 扇子的握柄(尾部)只有一个点 —— 这是输入(一份消息)。

  • 扇子的扇面(头部)是散开的很多条骨架 —— 这是输出(发给多个接收方)。

从“握柄”到“扇面”,骨子里的动作就是从一到多,这就是“扇出”。

扇形交换机

理解了“扇出”,就理解了扇形交换机。

在消息队列(如 RabbitMQ)中,Fanout 交换机(Fanout Exchange)也叫扇形交换机,可以把它理解成一个广播喇叭。它的工作方式很简单:

  • 忽略“地址”:它不关心消息上带的“路由键”(RoutingKey),只要消息来了,就无差别对待。

  • 全员广播:它会将收到的每条消息,都复制并发送给所有绑定到它上面的队列。绑定了几个队列,就复制几份,每个绑定的队列都会收到一模一样的一份消息。

Fanout 交换机的工作流程:

扇形交换机工作流程

他有什么作用?

这种“广播”特性,非常适合需要将一份消息通知给多个独立系统的场景:

  • 全局通知:比如用户下单成功,需要同时通知“积分系统”增加积分、“物流系统”准备发货、“短信系统”发送提醒,就可以用 Fanout 交换机广播这条订单消息。

  • 日志收集:应用程序的日志可以发送给 Fanout 交换机,然后同时分发给“实时监控面板”、“日志存储服务”和“错误报警系统”。