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

介绍

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


交换机类型

交换机分为3种类型。

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

Fanout广播

顾名思义将消息广播到交换机绑定的所有队列上,每个队列都可以接收到消息。

生产者

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

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

消费者

java 复制代码
@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");
    }
}
java 复制代码
play.queue
record.queue

两个消费者同时收到消息


Direct定向

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

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

这种模式更加的灵活

绑定路由器Key

在绑定队列的时候可以给改队列指定路由键名Key

一个队列可以绑定多个路由器Key

生产者

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

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

消费者

java 复制代码
@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");
    }

}
java 复制代码
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下的队列都会收到。

相关推荐
苏supper6 小时前
Spring Boot多环境配置与打包运行
spring boot·后端·spring
天衍四九-7 小时前
【无标题】
前端·spring boot·mysql·nginx·docker
今年下半年8 小时前
【Spring Boot】多种存储文件(FastDFS / MinIO / 阿里云 OSS)接入设计说明(附源码)
spring boot·分布式·中间件·简单工厂模式·策略模式
光依旧13 小时前
MCP实战手记(八):从“能跑“到“能上线“——无状态MCP Server的生产落地清单
java·人工智能·spring boot·架构·ai agent·mcp
MZ_ZXD00113 小时前
【关注可白嫖源码】--课程设计--毕业设计-- 29210 Vue.js 3+Springboot中药材基本信息与图片查询系统
javascript·spring boot·课程设计·毕设·大作业·程序开发·毕设代做
Cheney Pan14 小时前
第4篇 Spring Boot 应用监控:Micrometer 与 JVM 指标
jvm·spring boot·后端·prometheus
仍然.14 小时前
RabbitMQ---可靠性传输
网络·分布式·rabbitmq
小蒜学长15 小时前
基于Spring Boot+Vue的“禾源”农产品销售系统设计与实现(代码+数据库+LW)
java·spring boot·后端·农产品销售系统·产品溯源
墨鱼老师15 小时前
SpringBoot+Vue 毕设项目开发踩坑记录(前后端分离)
vue.js·spring boot·毕业设计·课程设计·前后端分离·java 毕设
灯澜忆梦15 小时前
【RabbitMQ #13】 | 延迟消息
分布式·rabbitmq·ruby