当前位置: 首页 > article >正文

SpringBoot 消息队列RabbitMQ 交换机模式 Fanout广播 Direct定向 Topic话题

介绍

作用是接收生产者发送的消息,并根据某种规则将这些消息路由到一个或多个队列。交换机根据绑定规则和路由键来决定如何将消息分发到队列。简而言之,交换机是消息路由的核心组件,它负责将消息从生产者引导到适当的队列,以便消费者能够处理这些消息。


交换机类型

交换机分为3种类型。

  • Fanout广播 顾名思义将消息广播到交换机绑定的所有队列上,每个队列都可以接收到消息。
  • Direct定向 将消息发生给不同的人,不同的服务接收不同的消息,会根据设置的规则发送给指定的队列,称为定向路由。
  • Topic话题 与 Direct定向不同的是他的routingKey可以是多个单词的列表以" . "分割。
    -在这里插入图片描述

Fanout广播

顾名思义将消息广播到交换机绑定的所有队列上,每个队列都可以接收到消息。
在这里插入图片描述

生产者

    private  final RabbitTemplate rabbitTemplate;
   @GetMapping("/putRecord") 
    public Result userMessage(){
    
        rabbitTemplate.convertAndSend("amq.fanout",null,"我是发送者");
        //1.交换机  2.路由键   3.消息
        return  Result.success("操作成功",null);
    }

对于 fanout 类型的交换机,路由键会被忽略,因为 fanout 类型的交换机会将消息广播到所有绑定到它的队列。所以,在这种情况下,你可以将路由键设为 null 或者直接忽略这个参数。

消费者

@Component
public class RecordQueues {
    @RabbitListener(queues ="play.queue")
    public  void  insertUserMessage(String msg){ //支付服务
        System.out.println("play.queue");
    }

    @RabbitListener(queues ="record.queue")
    public  void  recordUserMessage(String msg){ //记录服务
        System.out.println("record.queue");
    }
}
play.queue
record.queue

两个消费者同时收到消息


Direct定向

将消息发生给不同的人,不同的服务接收不同的消息,会根据设置的规则发送给指定的队列,称为定向路由。

  • 每一个队列都与交换机设置一个绑定的键名Key
  • 消息发送着指定消息的路由键名Key
  • 一个队列可以绑定多个键名

这种模式更加的灵活

绑定路由器Key
在绑定队列的时候可以给改队列指定路由键名Key
在这里插入图片描述
一个队列可以绑定多个路由器Key
在这里插入图片描述

生产者

给路由键名为del的队列发送消息,也就是del.queue和delMsg.queue

private  final RabbitTemplate rabbitTemplate;
@GetMapping("/putRecord") //插入记录
public Result userMessage(){
    rabbitTemplate.convertAndSend("amq.direct","del","我是发送者");
    return  Result.success("操作成功",null);
}

消费者

@Component
public class RecordQueues {
    @RabbitListener(queues ="add.queue")
    public  void  a(String msg){ //支付服务
        System.out.println("add.queue");
    }
    
    @RabbitListener(queues ="del.queue")
    public  void  b(String msg){ //记录服务
        System.out.println("query.queue");
    }

    @RabbitListener(queues ="delMsg.queue")
    public  void  c(String msg){ //记录服务
        System.out.println("delMsg.queue");
    }

}
delMsg.queue
query.queue

Topic话题

Direct定向不同的是他的routingKey可以是多个单词的列表以" . "分割。可以用他区分消息的类型或分组。

通过指定通配符绑定

  • #代指0个或多个单词
  • * 代指一个单词

例子
假如有以下routingKey(路由键名)
a.a123
a.a147
a.a369
b.b123
b.789
c.123
这个时候想给axx等发信息,可以使用Topic交换机指定a发信息,axx下的队列都会收到。


http://www.kler.cn/a/306874.html

相关文章:

  • mongoDB的安装及使用
  • react动态路由
  • MySQL:CRUD
  • ODOO学习笔记(8):模块化架构的优势
  • MTSET可溶于DMSO、DMF、THF等有机溶剂,并在水中有轻微的溶解性,91774-25-3
  • 服务号消息折叠折射出的腾讯傲慢:上云会不会也一样?
  • react使用技巧
  • Spring6学习笔记4:事务
  • Spring Boot-消息队列相关问题
  • C++从入门到起飞之——继承下篇(万字详解) 全方位剖析!
  • Pr:首选项 - 媒体
  • python打通hive数据库实现CRUD
  • 力扣最热一百题——螺旋矩阵
  • 动态住宅代理网络在广告验证中的作用
  • 卡车配置一键启动无钥匙进入手机控车
  • 详细分析Uniapp中的轮播图基本知识(附Demo)
  • PHP7 json_encode() 浮点小数溢出错误
  • 优先级队列算法
  • QUIC的丢包处理
  • 2_foc闭环调试_ADC电流采样与滤波及pid数据结构
  • python 检索与该查询最相似的句子 使用库hflayers和sentence_transformers来实现遇到的问题
  • libwebsockets之日志系统
  • 【C#】vs2022 .net8
  • Leetcode 165. 比较版本号(Medium)
  • 日用放大器
  • 监控binlog日志监控表变化进行消息通知