RabbitMQ中常用的三种交换机【Fanout、Direct、Topic】

目录

1、引入

2、Fanout交换机

案例:利用SpringAMQP演示Fanout交换机的使用

3、Direct交换机

案例:利用SpringAMQP演示Direct交换机的使用

4、Topic交换机

案例:利用SpringAMQP演示Topic交换机的使用


1、引入

真实的生产环境都会经过exchange来发送消息,而不是直接发送到队列,交换机常用类型:

  • Fanout:广播
  • Direct:定向
  • Topic:话题

为什么需要用到交换机:

我们上一篇文章案例中可以看到,消息发送者如果直接把消息发到队列中,消息就只能被一个消费者消费者,而生产环境下是存在一个消息发出去后,有好几个消费者都可以拿到这个消息去消费的~


2、Fanout交换机

Fanout交换机 会将接收到的消息广播到每一个与其绑定的queue上

案例:利用SpringAMQP演示Fanout交换机的使用

需求:

  • 在RabbitMQ控制台中,声明队列fanout.queue1和fanout.queue2
  • 在RabbitMQ控制台中,声明交换机fan.fanout,将两个队列与其绑定
  • 在consumer服务中,编写两个消费者方法,分别监听fanout.queue1和fanout.queue2
  • 在publisher中编写测试方法,向fan.fanout发送消息

控制台中的操作就不说了,直接看代码:

consumer:

复制代码
@RabbitListener(queues = "fanout.queue1")
    public void listenfan1(String msg) throws InterruptedException {
        System.out.println("接收到消息:" + msg);
    }
    @RabbitListener(queues = "fanout.queue2")
    public void listenfan2(String msg) throws InterruptedException {
        System.err.println("接收到消息:" + msg);
    }

publisher:

复制代码
 @Test
    public void fanoutdemo(){
        //交换机名
        String exchangeName = "fan.fanout";
        //消息
        String message = "are you ok ?  I am ok !";
        //发送消息
        rabbitTemplate.convertAndSend(exchangeName,null, message);
    }

结果:两个消费者都收到了


3、Direct交换机

Direct交换机 会将接收到的消息根据规则路由到指定的Queue,因此成为定向路由:

  • 每一个Queue都与Exchange设置一个BindingKey
  • 发布者发送消息时,指定消息的RoutingKey
  • Exchang将消息路由到BindingKey与消息RoutingKey一致的队列

举例:

现在有一个支付服务,要求支付成功后,给用户发送一条短信。此时支付服务会把支付结果发送到交换机中,而短信服务就会去监听这个交换机,但是交换机不会把所有的消息都路由给短信服务,而只把支付成功的消息路由给这个短信服务。这种情况下,就需要使用到这个Direct交换机,短信服务下的队列和这个交换机设置一个key(例如:success),支付服务发消息时,支付成功RoutingKey设为success,失败为fail,交换机就会只把key为success的消息路由给短信服务了~

如下:

上图中,就是,key为blue,消费者1去消费;key为yellow,消费者1去消费;key为red,两个消费者都能拿到这个消息一起去消息~

案例:利用SpringAMQP演示Direct交换机的使用

需求:

  • 在RabbitMQ控制台中,声明队列dir.queue1和dir.queue2
  • 在RabbitMQ控制台中,声明交换机dir.direct,将两个队列与其绑定
  • 在consumer服务中,编写两个消费者方法,分别监听dir.queue1和dir.queue2
  • 在publisher中编写测试方法,向dir.direct发送消息

控制台中的操作,注意:

直接看代码:

consumer:

复制代码
@RabbitListener(queues = "dir.queue1")
    public void listendir1(String msg) throws InterruptedException {
        System.out.println("接收到" + msg);
    }
    @RabbitListener(queues = "dir.queue2")
    public void listendir2(String msg) throws InterruptedException {
        System.err.println("接收到" + msg);
    }

publisher:

复制代码
@Test
    public void directdemo(){
        //交换机名
        String exchangeName = "dir.direct";
        //发送消息
        rabbitTemplate.convertAndSend(exchangeName,"red", "消息:red");
        rabbitTemplate.convertAndSend(exchangeName,"blue","消息:blue");
        rabbitTemplate.convertAndSend(exchangeName,"yellow","消息:yellow");
    }

结果:red都能收到,blue、yellow指定的queue才能收到


4、Topic交换机

Topic交换机与Direct交换机类似,区别在于RoutingKey可以是多个单词的列表,并且以 . 分割

Queue与交换机指定BindingKey时可以使用通配符:

  • : 代指0个或多个单词

  • * : 代指一个单词

案例:利用SpringAMQP演示Topic交换机的使用

需求:

  • 在RabbitMQ控制台中,声明队列topic.queue1和topic.queue2
  • 在RabbitMQ控制台中,声明交换机topic.topic,将两个队列与其绑定
  • 在consumer服务中,编写两个消费者方法,分别监听topic.queue1和topic.queue2
  • 在publisher中编写测试方法,利用不同的RoutingKey向topic.topic发送消息

控制台中的操作,注意:

consumer:

复制代码
@RabbitListener(queues = "topic.queue1")
    public void listentopic1(String msg) throws InterruptedException {
        System.out.println("接收到" + msg);
    }
    @RabbitListener(queues = "topic.queue2")
    public void listentopic2(String msg) throws InterruptedException {
        System.err.println("接收到" + msg);
    }

publisher:

复制代码
@Test
    public void topicdemo(){
        //交换机名
        String exchangeName = "topic.topic";
        //发送消息
        rabbitTemplate.convertAndSend(exchangeName,"china.whether", "消息:中国天气预报");
        rabbitTemplate.convertAndSend(exchangeName,"china.news","消息:中国新闻");
        rabbitTemplate.convertAndSend(exchangeName,"LD.whether","消息:外国天气预报");
        rabbitTemplate.convertAndSend(exchangeName,"LD.news","消息:外国新闻");
    }

结果:

一个只能接到新闻,一个只能接到和中国相关的消息~

相关推荐
qq_12498707531 小时前
基于Hadoop的信贷风险评估的数据可视化分析与预测系统的设计与实现(源码+论文+部署+安装)
大数据·人工智能·hadoop·分布式·信息可视化·毕业设计·计算机毕业设计
洛豳枭薰3 小时前
消息队列关键问题描述
kafka·rabbitmq·rocketmq
Coder_Boy_4 小时前
基于Spring AI的分布式在线考试系统-事件处理架构实现方案
人工智能·spring boot·分布式·spring
袁煦丞 cpolar内网穿透实验室5 小时前
远程调试内网 Kafka 不再求运维!cpolar 内网穿透实验室第 791 个成功挑战
运维·分布式·kafka·远程工作·内网穿透·cpolar
人间打气筒(Ada)5 小时前
GlusterFS实现KVM高可用及热迁移
分布式·虚拟化·kvm·高可用·glusterfs·热迁移
xu_yule5 小时前
Redis存储(15)Redis的应用_分布式锁_Lua脚本/Redlock算法
数据库·redis·分布式
難釋懷10 小时前
分布式锁的原子性问题
分布式
ai_xiaogui11 小时前
【开源前瞻】从“咸鱼”到“超级个体”:谈谈 Panelai 分布式子服务器管理系统的设计架构与 UI 演进
服务器·分布式·架构·分布式架构·panelai·开源面板·ai工具开发
凯子坚持 c11 小时前
如何基于 CANN 原生能力,构建一个支持 QoS 感知的 LLM 推理调度器
分布式