Exchange 交换机类型,六种工作模式与 Spring Boot 整合

一.Exchange 交换机类型

RabbitMQ 有四种内置交换机,下面直接上 Spring Boot 代码。


1. Direct Exchange(精确匹配)

场景 :根据路由键精确投递,比如 order.create 只发给订单创建队列。

配置类:

java 复制代码
@Configuration
public class DirectConfig {

    public static final String EXCHANGE = "direct.exchange";
    public static final String QUEUE = "direct.queue";
    public static final String ROUTING_KEY = "order.create";

    @Bean
    public Queue directQueue() {
        return new Queue(QUEUE);
    }

    @Bean
    public DirectExchange directExchange() {
        return new DirectExchange(EXCHANGE);
    }

    @Bean
    public Binding directBinding() {
        return BindingBuilder.bind(directQueue())
                .to(directExchange())
                .with(ROUTING_KEY);
    }
}

生产者:

typescript 复制代码
@Service
public class DirectProducer {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    public void send(String msg) {
        rabbitTemplate.convertAndSend(
            DirectConfig.EXCHANGE, 
            "order.create", 
            msg
        );
    }
}

消费者:

typescript 复制代码
@Component
public class DirectConsumer {
    @RabbitListener(queues = "direct.queue")
    public void receive(String msg) {
        System.out.println("Direct 收到: " + msg);
    }
}

2. Fanout Exchange(广播)

场景:一条消息发给所有绑定的队列,无视 routing key。

typescript 复制代码
@Bean
public FanoutExchange fanoutExchange() {
    return new FanoutExchange("fanout.exchange");
}

@Bean
public Queue fanoutQueueA() { return new Queue("fanout.A"); }

@Bean
public Queue fanoutQueueB() { return new Queue("fanout.B"); }

@Bean
public Binding bindA() {
    return BindingBuilder.bind(fanoutQueueA()).to(fanoutExchange());
}

@Bean
public Binding bindB() {
    return BindingBuilder.bind(fanoutQueueB()).to(fanoutExchange());
}

发消息时 routing key 写 "" 即可:

arduino 复制代码
rabbitTemplate.convertAndSend("fanout.exchange", "", "广播消息");

3. Topic Exchange(通配符匹配)

场景 :按主题分类,如 order.# 匹配所有订单消息。

typescript 复制代码
@Bean
public TopicExchange topicExchange() {
    return new TopicExchange("topic.exchange");
}

@Bean
public Queue topicQueue() {
    return new Queue("topic.queue");
}

@Bean
public Binding topicBinding() {
    // # 匹配零个或多个单词,* 匹配一个单词
    return BindingBuilder.bind(topicQueue())
            .to(topicExchange())
            .with("order.#");
}

4. Headers Exchange(头匹配)

用得少,被 Topic 替代,面试知道有这个东西就行。


小结 :Direct 最常用,Fanout 做广播,Topic 做灵活路由。代码套路都是 Queue + Exchange + Binding 三板斧。


二.六种工作模式与 Spring Boot 整合

六种模式本质就是 Exchange + Queue 的不同组合,下面挑最常用的三种写代码。


1. Simple / Work Queue(一个队列多个消费者竞争)

配置:

typescript 复制代码
@Bean
public Queue workQueue() {
    return new Queue("work.queue");
}

两个消费者(模拟竞争):

typescript 复制代码
@Component
public class WorkConsumer {

    @RabbitListener(queues = "work.queue")
    public void worker1(String msg) {
        System.out.println("Worker1 处理: " + msg);
    }

    @RabbitListener(queues = "work.queue")
    public void worker2(String msg) {
        System.out.println("Worker2 处理: " + msg);
    }
}

生产者:

arduino 复制代码
rabbitTemplate.convertAndSend("", "work.queue", "任务" + i);

注意:这里 Exchange 为空字符串,表示使用默认 Direct Exchange,routing key 直接写队列名。


2. Publish/Subscribe(发布订阅)

就是 Fanout Exchange,见记录二。一条消息多个消费者各自收到一份。


3. Routing(路由模式)

Direct Exchange 的实战版,比如日志按级别路由:

typescript 复制代码
@Bean
public DirectExchange logExchange() {
    return new DirectExchange("log.exchange");
}

@Bean
public Queue errorQueue() { return new Queue("log.error"); }

@Bean
public Queue infoQueue() { return new Queue("log.info"); }

@Bean
public Binding errorBinding() {
    return BindingBuilder.bind(errorQueue())
            .to(logExchange()).with("error");
}

@Bean
public Binding infoBinding() {
    return BindingBuilder.bind(infoQueue())
            .to(logExchange()).with("info");
}

发消息:

arduino 复制代码
rabbitTemplate.convertAndSend("log.exchange", "error", "系统崩溃");
rabbitTemplate.convertAndSend("log.exchange", "info", "用户登录");

4. Topic 模式实战

csharp 复制代码
// 绑定键:只接收 china 相关的天气新闻
@Bean
public Binding weatherBinding() {
    return BindingBuilder.bind(weatherQueue())
            .to(topicExchange())
            .with("china.weather.#");
}

小结:Work Queue 做任务分发,Pub/Sub 做广播,Routing/Topic 做精确或模糊路由。

相关推荐
付威202317 分钟前
target 目录越来越大,Rust 项目该怎么清理
后端
技录局28 分钟前
Kafka 深度原理分析:从消息流到分布式日志
后端
大数据技术派34 分钟前
我用AI写代码,做了3个小玩意儿
后端·微信小程序
爱上咖啡香2 小时前
我给 Laravel AI 写了个千问驱动,文本、语音、图像、视频全打通
后端
杨文说AI与数字化2 小时前
票种表重构复盘:把填数字改成规则可执行版本
后端
回家路上绕了弯2 小时前
什么是 Agent as a Service?把 AI Agent 变成可调用的服务
后端
金銀銅鐵3 小时前
一个 Java 文件实现《孫子兵法·始計篇》中英对照阅读器
java·后端·ai编程
用户360055579004 小时前
Kestrel_VLLM - 34 · 批量 M 行:五个块、两种层型,与「退回去」的两个原语
后端
leo在掘金5 小时前
25.5k Star 的 DeepInfer 怎么扛住3万亿参数
后端·架构
Agent世界5 小时前
cookie 判据会撒谎:CDP 登录态保活的五个实测坑
后端·自动化运维