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.sports
或news.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)
- 对应机制:
- 默认直连队列(无Exchange),生产者直接发消息到指定队列,单个消费者消费。
- 本质:最基础的点对点通信。
2. 工作队列模式(Work Queue)
- 对应机制:
- Direct Exchange的简化版:多个消费者共享同一队列,消息轮询或竞争消费(仍属于路由模式,但隐式使用队列名作为Routing Key)。
- 特点:无显式Routing Key,负载均衡分发。
3. 发布/订阅模式(Pub/Sub)
- 对应机制:
- Fanout Exchange:消息广播到所有绑定队列,忽略Routing Key。
- 特点:1:N广播,所有订阅者收到相同消息。
4. 路由模式(Routing)
- 对应机制:
- Direct Exchange:消息通过精确匹配Routing Key路由到指定队列。
- 特点:1:1或1:N(相同Key的队列),精确控制接收方。
5. 通配符模式(Topics)
- 对应机制:
- Topic Exchange:通过通配符(
*
匹配一个词,#
匹配多级)动态匹配Routing Key。 - 特点:灵活分类,如
news.sports
或weather.*
。
- Topic Exchange:通过通配符(
三、总结对应关系
模式名称 | 对应Exchange类型 | Routing Key规则 | 分发逻辑 |
---|---|---|---|
简单模式 | (无,直连队列) | 队列名作为隐式Key | 1:1点对点 |
工作队列模式 | Direct(隐式) | 队列名作为隐式Key | 1:N竞争消费 |
发布/订阅模式 | Fanout | 忽略 | 1:N广播 |
路由模式 | Direct | 精确匹配 | 1:1或1:N(相同Key) |
通配符模式 | Topic | * 或# 通配符 | M:N动态匹配 |