RabbitMQ支持四种主要的交换机类型,每种类型有其特定的消息路由方式和应用场景:
Topic交换机
工作原理: 根据路由键的模式匹配将消息路由到队列
1
2
3
4
5
6
7
8
|
// 配置示例
@Bean
public TopicExchange topicExchange() {
return new TopicExchange("group_buy_market_exchange", true, false);
}
// 绑定示例
BindingBuilder.bind(queue).to(topicExchange()).with("topic.team_success");
|
特点:
- 支持通配符:
*
(匹配一个单词) 和 #
(匹配零个或多个单词)
- 路由键通常使用点号分隔,如
topic.team.success
- 灵活性高,可实现点对点和发布/订阅模式
Direct交换机
工作原理: 完全匹配路由键将消息路由到队列
1
2
3
4
5
6
7
|
@Bean
public DirectExchange directExchange() {
return new DirectExchange("direct_exchange", true, false);
}
// 绑定示例
BindingBuilder.bind(queue).to(directExchange()).with("payment.success");
|
特点:
- 路由键必须完全匹配
- 简单直接,性能较高
- 适合明确知道消息应该发送到哪个队列的场景
Fanout交换机
工作原理: 忽略路由键,将消息广播到所有绑定的队列
1
2
3
4
5
6
7
|
@Bean
public FanoutExchange fanoutExchange() {
return new FanoutExchange("fanout_exchange", true, false);
}
// 绑定示例 - 不需要路由键
BindingBuilder.bind(queue).to(fanoutExchange());
|
特点:
- 最快的交换机类型,不进行路由计算
- 消息广播到所有绑定队列
- 适合需要将消息发送给多个消费者的场景,如日志系统
工作原理: 基于消息头属性而非路由键进行匹配
1
2
3
4
5
6
7
8
9
|
@Bean
public HeadersExchange headersExchange() {
return new HeadersExchange("headers_exchange", true, false);
}
// 绑定示例
BindingBuilder.bind(queue).to(headersExchange())
.where("format").matches("pdf")
.and("type").matches("report");
|
特点:
- 使用消息头属性进行匹配,忽略路由键
- 可以指定多个头部属性以及匹配规则(all匹配所有/any匹配任一)
- 性能较低,使用较少
- 适合需要基于多个条件路由的场景
选型对比
交换机类型 |
匹配方式 |
性能 |
应用场景 |
Topic |
路由键模式匹配 |
中等 |
灵活的消息路由,支持多条件分发 |
Direct |
路由键精确匹配 |
高 |
明确的点对点通信 |
Fanout |
广播(无匹配) |
最高 |
广播消息,一对多通知 |
Headers |
消息头属性匹配 |
低 |
复杂的条件匹配,基于消息属性而非路由键 |