交换机是RabbitMQ路由消息的核心,不同类型的交换机对应不同的路由逻辑,交换机和路由规则是多对多绑定,适配不同的业务场景。RabbitMQ提供4种默认交换机类型,其中前3种最常用。
1、Direct Exchange(直连交换机):精准匹配,一对一/多路由
Direct交换机是最基础的类型,核心逻辑是"路由键(Routing Key)与绑定键(Binding Key)完全匹配",仅当两者字符完全一致时,消息才会被路由到对应队列。
核心特性:
- 路由规则简单直接,精准度高。
- 一个队列可绑定多个Binding Key,一个Binding Key也可绑定多个队列(此时消息会被路由到所有匹配队列,类似"多播")。
适用场景:
需要精准路由的场景,例如:
-
业务模块拆分:"订单支付"消息仅路由到"支付处理队列","订单退款"消息仅路由到"退款处理队列"。
-
任务分发:特定类型的任务分配给指定的工作队列(如视频转码任务分配给转码 worker 队列)。
工作流程示例:
-
声明Direct交换机(名称:direct_exchange);
-
队列A绑定Binding Key = "order.pay",队列B绑定Binding Key = "order.refund",队列C绑定Binding Key = "order.pay";
-
生产者发送消息,指定Routing Key = "order.pay";
-
交换机匹配后,将消息路由到队列A和队列C,队列B无消息。
交换机绑定队列的代码如下:
// 声明一个直连交换机
channel.exchangeDeclare("direct_exchange", "direct", true);
// 声明一个队列
channel.queueDeclare("order_queue", true, false, false, null);
// 将队列绑定到交换机,绑定键为 "order.create"
channel.queueBind("order_queue", "direct_exchange", "order.create");
2、Fanout Exchange(扇出交换机):无差别广播,一对多路由
Fanout交换机是"广播型"交换机,核心逻辑是"忽略Routing Key,将消息路由到所有与该交换机绑定的队列",无需匹配规则,只要队列绑定了交换机,就能收到消息。
核心特性:
- 路由逻辑最简单,效率最高(无需匹配计算)。
- 消息会被复制到所有绑定队列,每个队列都能收到完整消息。
适用场景:
需要广播消息的场景,例如:
- 系统通知:服务启动/下线通知、全局配置更新,所有相关服务都需接收。
- 日志收集:应用日志同时发送到"实时分析队列"和"归档存储队列"。
- 事件同步:用户注册成功后,同步触发"发送欢迎短信""创建用户档案""添加积分"等多个任务。
工作流程示例:
-
声明Fanout交换机(名称:fanout_exchange);
-
队列1、队列2绑定该交换机,队列3未绑定;
-
生产者发送消息(即使指定Routing Key,也会被忽略);
-
交换机将消息路由到队列1和队列2,队列3无消息。
3、Topic Exchange(主题交换机):模糊匹配,按"主题"路由
Topic交换机是最灵活的类型,核心逻辑是"通过通配符匹配Routing Key与Binding Key",支持按"主题"批量路由消息,兼顾精准性和灵活性。
核心特性:
- Routing Key和Binding Key需为"多段字符串"(段之间用"."分隔,如"user.create.wechat"),每段代表一个业务维度(如业务类型、操作、渠道)。
支持两种通配符:
*(星号):匹配1个任意段(如"user.*"可匹配"user.create""user.delete",但不匹配"user.create.wechat");
#(井号):匹配0个或多个任意段(如"user.#"可匹配"user""user.create""user.create.wechat")。
适用场景:
需要按"主题"分类路由的场景,例如:
- 多维度业务消息:通过"user.#"接收所有用户相关消息,通过"user.create.*"仅接收用户创建的细分消息。
- 跨模块消息分发:订单消息按地区拆分,Binding Key = "order.#.beijing"仅接收北京地区的订单消息。
工作流程示例:
-
声明Topic交换机(名称:topic_exchange);
-
队列A绑定Binding Key = "user.create.*",队列B绑定Binding Key = "user.#",队列C绑定Binding Key = "user.*.alipay";
-
生产者发送消息,指定Routing Key = "user.create.wechat";
-
交换机匹配后,将消息路由到队列A(*匹配"wechat")和队列B(#匹配"create.wechat"),队列C不匹配无消息。
4、Headers Exchange(头部交换机):按消息头匹配,忽略Routing Key
Headers交换机通过消息的头部属性(而非Routing Key)进行匹配,灵活性较高,但路由逻辑复杂,性能略差,实际应用中较少使用。核心逻辑是:生产者发送消息时设置消息头(如"type=order""priority=high"),交换机根据绑定队列时指定的头部规则(如"匹配所有头""匹配任意头")路由消息。
****适用场景:****需根据多维度属性路由消息,且不希望依赖Routing Key的特殊场景(如复杂的权限控制消息)。