RabbitMQ的交换机

一、三种交换机模式

核心区别对比​

​特性​ ​广播模式(Fanout)​ ​路由模式(Direct)​ ​主题模式(Topic)​
​路由规则​ 无条件复制到所有绑定队列 精确匹配 Routing Key 通配符匹配 Routing Key*/#
​消息分发​ 1:N(所有消费者收到相同消息) 1:1 或 1:N(相同 Key 的队列) M:N(灵活匹配多个队列)
​典型应用场景​ 系统通知、多服务数据同步 任务分发、精确路由(如支付处理) 分类事件(如日志分级、新闻订阅)
​Exchange 类型​ Fanout Exchange(RabbitMQ) Direct Exchange Topic Exchange
​Routing Key​ 忽略 必须完全匹配 支持通配符(如 news.*

​2. 详细说明​

​(1) 广播模式(Fanout)​
  • ​核心逻辑​
    消息发送到 Fanout Exchange 后,会​无条件复制到所有绑定的队列​,消费者订阅不同队列时会收到相同消息。
  • ​示例场景​
    • 系统公告:一条消息需同时触发邮件、短信、日志服务。
    • 数据同步:订单创建后广播给库存、物流、分析服务。
  • ​特点​
    • 简单粗暴,无过滤逻辑。
    • 性能开销较大(消息全量复制)。
​(2) 路由模式(Direct)​
  • ​核心逻辑​
    消息通过精确的 Routing Key 匹配到指定队列,只有绑定相同 Key 的消费者能收到消息。
  • ​示例场景​
    • 支付处理:routing_key=payment.success 仅路由到支付服务队列。
    • 任务分发:多个 worker 竞争消费同一队列(工作队列模式)。
  • ​特点​
    • 精准控制消息接收方。
    • 灵活性较低(需提前定义 Key)。
​(3) 主题模式(Topic)​
  • ​核心逻辑​
    通过通配符(* 匹配一个单词,# 匹配多级)动态匹配 Routing Key,实现灵活的路由。
  • ​示例场景​
    • 日志分级:log.error 路由到告警服务,log.info 路由到存储服务。
    • 新闻订阅:用户订阅 news.sportsnews.weather
  • ​特点​
    • 兼顾广播的覆盖范围和路由的精确性。
    • 适合多维度、分层级的消息分类。

​3. 不同消息队列的实现​

​MQ 类型​ ​广播模式​ ​路由模式​ ​主题模式​
​RabbitMQ​ Fanout Exchange Direct Exchange Topic Exchange
​Kafka​ 多个 Consumer Group 独立消费 单 Partition 或 Key 路由 Topic + 通配符订阅
​RocketMQ​ 广播消费(Broadcasting) Tag 过滤(精确匹配) Tag 过滤(通配符支持)

​4. 如何选择?​

  • ​需要无条件广播?​​Fanout​(如全量数据同步)。
  • ​需要精确路由?​​Direct​(如支付结果处理)。
  • ​需要动态分类?​​Topic​(如日志分级、多维度事件)。

5.java代码实现(生产者)

​总结​

  • ​广播模式​:简单粗暴,适合全覆盖场景。
  • ​路由模式​:精准控制,适合点对点或任务分发。
  • ​主题模式​:灵活匹配,适合复杂分类和订阅需求。

二、RabbitMQ对应的工作模式

​1. 简单模式(Simple)​

  • ​对应机制​
    • 交换机类型​ :默认使用​默认交换机("",无名交换机)​ ,类型为direct
    • ​特点​:生产者直接将消息发送到队列(通过默认交换机绑定队列),消费者从队列中读取消息。
    • ​关系​ :无需显式声明交换机,消息通过队列名直接路由(routing_key = 队列名)。

​2. 工作队列模式(Work Queue)​

  • ​对应机制​
    • 交换机类型​ :同样使用​默认交换机​direct)。
    • ​特点​:多个消费者共享一个队列,消息以轮询(Round-Robin)或公平分发的方式分配给消费者。
    • ​关系​:与简单模式类似,但通过多个消费者实现负载均衡。交换机类型不直接影响分发逻辑(由队列自身管理)。

​3. 发布/订阅模式(Pub/Sub)​

  • ​对应机制​
    • 交换机类型​ :必须使用fanout交换机​
    • ​特点​:消息会被广播到所有绑定的队列(每个队列的消费者都会收到相同消息)。
    • ​关系​fanout交换机忽略routing_key,直接将消息复制到所有绑定的队列,实现广播。

​4. 路由模式(Routing)​

  • ​对应机制​
    • 交换机类型​ :必须使用direct交换机​
    • ​特点​ :消息根据routing_key精确匹配队列,只有匹配的队列会接收消息。
    • ​关系​direct交换机通过routing_key的完全匹配决定消息路由,适合定向分发。

​5. 通配符模式(Topics)​

  • ​对应机制​
    • 交换机类型​ :必须使用topic交换机​
    • ​特点​ :消息根据routing_key的模式匹配(支持通配符*#)分发到队列。
    • ​关系​topic交换机通过灵活的路由规则实现部分匹配,适合多维度条件路由。

​三、总结对应关系​

​模式名称​ ​对应Exchange类型​ ​Routing Key规则​ ​分发逻辑​
简单模式 (无,直连队列) 队列名作为隐式Key 1:1点对点
工作队列模式 Direct(隐式) 队列名作为隐式Key 1:N竞争消费
发布/订阅模式 Fanout 忽略 1:N广播
路由模式 Direct 精确匹配 1:1或1:N(相同Key)
通配符模式 Topic *#通配符 M:N动态匹配
相关推荐
hzj66 小时前
Sentinel学习
分布式·学习·sentinel
JAVA百练成神7 小时前
Java引用RabbitMQ快速入门
java·rabbitmq·java-rabbitmq
麻芝汤圆7 小时前
在 Sheel 中运行 Spark:开启高效数据处理之旅
大数据·前端·javascript·hadoop·分布式·ajax·spark
lix的小鱼8 小时前
在sheel中运行Spark
大数据·分布式·spark
代码的奴隶(艾伦·耶格尔)8 小时前
RabbitMq(尚硅谷)
分布式·rabbitmq
Aaaa小嫒同学9 小时前
spark local模式
大数据·分布式·spark
IvanCodes9 小时前
二、Hadoop狭义和广义的理解
大数据·hadoop·分布式
知识的小蚂蚁9 小时前
分布式、高并发-Day03
分布式
天堂的恶魔9469 小时前
C++ - 仿 RabbitMQ 实现消息队列(1)(环境搭建)
开发语言·c++·rabbitmq
猪猪果泡酒10 小时前
Spark,配置历史服务
大数据·分布式·spark