返回
Featured image of post RabbitMQ交换机类型比较

RabbitMQ交换机类型比较

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());

特点:

  • 最快的交换机类型,不进行路由计算
  • 消息广播到所有绑定队列
  • 适合需要将消息发送给多个消费者的场景,如日志系统

Headers交换机

工作原理: 基于消息头属性而非路由键进行匹配

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 消息头属性匹配 复杂的条件匹配,基于消息属性而非路由键
Licensed under CC BY-NC-SA 4.0
© 2023 - 2025 壹壹贰捌· 0Days
共书写了257k字·共 96篇文章 京ICP备2023035941号-1