RabbitMQ学习笔记-交换机类型和路由规则

交换机是RabbitMQ路由消息的核心,不同类型的交换机对应不同的路由逻辑,交换机和路由规则是多对多绑定,适配不同的业务场景。RabbitMQ提供4种默认交换机类型,其中前3种最常用。

1、Direct Exchange(直连交换机):精准匹配,一对一/多路由

Direct交换机是最基础的类型,核心逻辑是"路由键(Routing Key)与绑定键(Binding Key)完全匹配",仅当两者字符完全一致时,消息才会被路由到对应队列。

核心特性:

  1. 路由规则简单直接,精准度高。
  2. 一个队列可绑定多个Binding Key,一个Binding Key也可绑定多个队列(此时消息会被路由到所有匹配队列,类似"多播")。

适用场景:

需要精准路由的场景,例如:

  1. 业务模块拆分:"订单支付"消息仅路由到"支付处理队列","订单退款"消息仅路由到"退款处理队列"。

  2. 任务分发:特定类型的任务分配给指定的工作队列(如视频转码任务分配给转码 worker 队列)。

工作流程示例:

  1. 声明Direct交换机(名称:direct_exchange);

  2. 队列A绑定Binding Key = "order.pay",队列B绑定Binding Key = "order.refund",队列C绑定Binding Key = "order.pay";

  3. 生产者发送消息,指定Routing Key = "order.pay";

  4. 交换机匹配后,将消息路由到队列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,将消息路由到所有与该交换机绑定的队列",无需匹配规则,只要队列绑定了交换机,就能收到消息。

核心特性:

  1. 路由逻辑最简单,效率最高(无需匹配计算)。
  2. 消息会被复制到所有绑定队列,每个队列都能收到完整消息。

适用场景:

需要广播消息的场景,例如:

  1. 系统通知:服务启动/下线通知、全局配置更新,所有相关服务都需接收。
  2. 日志收集:应用日志同时发送到"实时分析队列"和"归档存储队列"。
  3. 事件同步:用户注册成功后,同步触发"发送欢迎短信""创建用户档案""添加积分"等多个任务。

工作流程示例:

  1. 声明Fanout交换机(名称:fanout_exchange);

  2. 队列1、队列2绑定该交换机,队列3未绑定;

  3. 生产者发送消息(即使指定Routing Key,也会被忽略);

  4. 交换机将消息路由到队列1和队列2,队列3无消息。

3、Topic Exchange(主题交换机):模糊匹配,按"主题"路由

Topic交换机是最灵活的类型,核心逻辑是"通过通配符匹配Routing Key与Binding Key",支持按"主题"批量路由消息,兼顾精准性和灵活性。

核心特性:

  1. Routing Key和Binding Key需为"多段字符串"(段之间用"."分隔,如"user.create.wechat"),每段代表一个业务维度(如业务类型、操作、渠道)。

支持两种通配符:

*(星号):匹配1个任意段(如"user.*"可匹配"user.create""user.delete",但不匹配"user.create.wechat");

#(井号):匹配0个或多个任意段(如"user.#"可匹配"user""user.create""user.create.wechat")。

适用场景:

需要按"主题"分类路由的场景,例如:

  1. 多维度业务消息:通过"user.#"接收所有用户相关消息,通过"user.create.*"仅接收用户创建的细分消息。
  2. 跨模块消息分发:订单消息按地区拆分,Binding Key = "order.#.beijing"仅接收北京地区的订单消息。

工作流程示例:

  1. 声明Topic交换机(名称:topic_exchange);

  2. 队列A绑定Binding Key = "user.create.*",队列B绑定Binding Key = "user.#",队列C绑定Binding Key = "user.*.alipay";

  3. 生产者发送消息,指定Routing Key = "user.create.wechat";

  4. 交换机匹配后,将消息路由到队列A(*匹配"wechat")和队列B(#匹配"create.wechat"),队列C不匹配无消息。

4、Headers Exchange(头部交换机):按消息头匹配,忽略Routing Key

Headers交换机通过消息的头部属性(而非Routing Key)进行匹配,灵活性较高,但路由逻辑复杂,性能略差,实际应用中较少使用。核心逻辑是:生产者发送消息时设置消息头(如"type=order""priority=high"),交换机根据绑定队列时指定的头部规则(如"匹配所有头""匹配任意头")路由消息。

****适用场景:****需根据多维度属性路由消息,且不希望依赖Routing Key的特殊场景(如复杂的权限控制消息)。

相关推荐
小O的算法实验室3 小时前
AAAI-26,全局相关性学习:通过谱图神经网络增强进化算法
神经网络·学习·算法
宁风NF3 小时前
JavaScript:网络请求与前端通信
开发语言·前端·javascript·网络·学习·ecmascript
xqqxqxxq3 小时前
DML 表数据:插入、删除、修改
笔记·mysql
不会代码的小猴3 小时前
Linux note2
linux·笔记
神神道呵he4 小时前
[深度学习] 大模型学习-RAG技术全景解析
人工智能·深度学习·学习
MartinYeung54 小时前
[论文学习]AgentSafetyBench:大语言模型智能体安全评估基准深度分析
学习·安全·语言模型
xqqxqxxq4 小时前
MySQL 数据类型笔记
数据库·笔记·mysql
笨蛋不要掉眼泪5 小时前
RabbitMQ消息队列:发送者的可靠性
java·分布式·rabbitmq
艾莉丝努力练剑6 小时前
【Linux:动静态库】Linux 动静态库与可执行文件
linux·运维·服务器·学习·面试·文件系统·动静态库
软件技术NINI6 小时前
盗墓笔记html+css+js 2页
css·笔记·html