消息队列RabbitMQ.02.交换机的讲解与使用

news2024/9/28 21:21:26

目录

RabbitMQ中交换机的基本概念与作用解析

交换机的作用:

交换机的类型:

直连交换机(Direct Exchange): 将消息路由到与消息中的路由键(Routing Key)完全匹配的队列。

主题交换机(Topic Exchange): 使用通配符匹配路由键,允许更灵活的消息路由。

扇形交换机(Fanout Exchange): 将消息广播到与交换机绑定的所有队列,无视消息的路由键。

头部交换机(Headers Exchange): 使用消息头信息进行匹配,而不是路由键。

死信交换机(Dead Letter Exchange)是在消息队列系统中一种用于处理死信(Dead Letter Messages)的机制。死信通常是指由于某些原因而无法被成功处理的消息,这些原因可能包括消息过期、消息被拒绝、队列满等。

 个人总结:


RabbitMQ中交换机的基本概念与作用解析


交换机的作用:

  • 消息分发: 交换机接收发布者发送的消息,并负责将消息路由到一个或多个队列。
  • 路由规则定义: 通过交换机可以定义消息的路由规则,以确保消息被正确地发送到目标队列。

交换机的类型:

  • 直连交换机(Direct Exchange): 将消息路由到与消息中的路由键(Routing Key)完全匹配的队列。

直连交换机只能通过queue发送一个请求,如果需要发送多个请求那么就要进行多个配置

//--------直连交换机
    @Bean
    public Queue queue1() {
        return new Queue("queue1");
    }

    @Bean
    public Queue queue2() {
        return new Queue("queue2");
    }

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

    @Bean
    public Binding binding01(){
        return BindingBuilder
                .bind(queue1())
                .to(directExchange())
                .with("aa");
    }
    @Bean
    public Binding binding02(){
        return BindingBuilder
                .bind(queue2())
                .to(directExchange())
                .with("bb");
    }

 消费者接受信息

@Component
@SuppressWarnings("all")
@Slf4j
@RabbitListener(queues = "queue1")
public class ReceiverQ1 {

    @RabbitHandler
    public void process(String msg) {
        log.warn("q1接收到:" + msg);
    }
}

测试

@RestController
public class TestController {

    @Autowired
    private AmqpTemplate template;
    @Autowired
    private ObjectMapper objectMapper;

   
    @RequestMapping("/send3")
    public String send3(){
        template.convertAndSend("directExchange","aa","hello");
        return "🤣";
    }


}

 


  • 主题交换机(Topic Exchange): 使用通配符匹配路由键,允许更灵活的消息路由。
  1. 通配符的含义:

    • 星号(*): 匹配一个单词,可以出现在路由键的任意位置。例如,"animal.*"匹配"animal.rabbit"和"animal.cat"等。
    • 井号(#): 匹配零个或多个单词,只能出现在路由键的末尾。例如,"animal.#"匹配"animal.rabbit"、"animal.cat"和"animal.mammal.large"等。

主题交换机可以通过配置多个路由键来实现不同的键进入不同的消费者,如:交换机a,交换机b,

现在有一个包含a和b的键那么两个都能进入不同的消费者功能更加强大,并且可以配置通配符,根据通配符 * #  来实现进入不同的消费者

//--------------主题交换机
    // *.*.aa -> Q1
    // *.*.bb -> Q2
    // mq.# -> Q1,Q2
    // 一个队列可以用多个绑定键

    @Bean
    public TopicExchange topicExchange(){
        return  new TopicExchange("topicExchange");
    }

    @Bean
    public Binding binding03(){
        return BindingBuilder
                .bind(queue1())
                .to(topicExchange())
                .with("*.*.aa");
    }

    @Bean
    public Binding binding04(){
        return BindingBuilder
                .bind(queue2())
                .to(topicExchange())
                .with("*.*.bb");
    }

    @Bean
    public Binding binding05(){
        return BindingBuilder
                .bind(queue1())
                .to(topicExchange())
                .with("mq.#");
    }

    @Bean
    public Binding binding06(){
        return BindingBuilder
                .bind(queue2())
                .to(topicExchange())
                .with("mq.#");
    }

测试


@RestController
public class TestController {

    @Autowired
    private AmqpTemplate template;
    @Autowired
    private ObjectMapper objectMapper;

   
     @RequestMapping("/send4")
    public String send4(String rex){
        template.convertAndSend("topicExchange",rex,"hello");
        return "🤣";
    }



}

 


  • 扇形交换机(Fanout Exchange): 将消息广播到与交换机绑定的所有队列,无视消息的路由键。

扇形交换机可以统一发送请求,列入可以运用到,商城活动时统一给用户发送商城活动信息

//--------------扇形交换机
    // 广播,群发
    //它上面的队列不需要binding key

    @Bean
    public FanoutExchange fanoutExchange(){
        return new FanoutExchange("fanoutExchange");
    }
    @Bean
    public Binding binding07(){
        return BindingBuilder
                .bind(queue1())
                .to(fanoutExchange());
    }
    @Bean
    public Binding binding08(){
        return BindingBuilder
                .bind(queue2())
                .to(fanoutExchange());
    }

测试代码

 @RequestMapping("/send5")
    public String send5(){
        template.convertAndSend("fanoutExchange","","hello");
        return "🤣";
    }

 上述效果图:


 

  • 头部交换机(Headers Exchange): 使用消息头信息进行匹配,而不是路由键。

头部交换机(Headers Exchange)是RabbitMQ中的一种交换机类型,与其他类型的交换机(直连交换机、主题交换机、扇出交换机)不同,头部交换机使用消息的头信息(Headers)而不是路由键来进行消息的路由。头部交换机提供更灵活的路由方式,允许根据消息头的键值对进行匹配。

 以下是头部交换机的一些关键特性和使用方式:

  1. 消息头信息:

    • 键值对: 消息头是由一系列键值对组成的,用于描述消息的属性。
    • 自定义属性: 消息头可以包含自定义的属性,根据应用程序的需要定义不同的属性信息。
  2. 匹配规则:

    • 匹配方式: 消息通过匹配消息头的键值对来确定路由目标。
    • 多条件匹配: 可以定义多个键值对,消息需要满足所有条件才能被正确路由。
  3. 绑定关系:

    • 绑定头信息: 在绑定队列到头部交换机时,可以指定一个或多个键值对作为匹配条件。
    • 匹配算法: 消息头需要匹配绑定队列时指定的键值对条件,才能被路由到相应的队列。
  4. 使用场景:

    • 复杂路由逻辑: 当消息的路由逻辑需要根据多个条件进行判断时,头部交换机提供了更灵活的解决方案。
    • 自定义属性: 当消息携带有多个自定义属性,需要根据这些属性进行复杂匹配时,头部交换机是一个合适的选择。
  5. 示例:

    • 如果有一个消息头包含"content-type"为"application/json",并且"priority"为"high",一个队列可以通过绑定这两个条件到头部交换机来接收符合这两个条件的消息。
    • 另一个队列可以通过绑定"content-type"为"application/xml"的条件来接收不同类型的消息。

头部交换机适用于需要根据消息的多个属性进行复杂匹配的场景,提供了更高度定制化的消息路由能力。


  • 死信交换机(Dead Letter Exchange)是在消息队列系统中一种用于处理死信(Dead Letter Messages)的机制。死信通常是指由于某些原因而无法被成功处理的消息,这些原因可能包括消息过期、消息被拒绝、队列满等。

以下是关于死信交换机的基本概念和作用:

  1. 死信的产生原因:

    • 消息过期: 消息在队列中等待的时间超过了指定的过期时间。
    • 消息被拒绝: 消费者拒绝消费消息,并且消息被标记为不可重新投递。
    • 队列满: 队列达到最大容量,无法再接收新的消息。
  2. 死信交换机的作用:

    • 死信路由: 当消息被标记为死信时,它会被发送到死信交换机。
    • 重新处理或记录: 可以通过死信交换机重新将消息发送到其他队列,进行额外处理,或者记录日志以分析死信的原因。
  3. 死信交换机的配置:

    • 绑定关系: 死信交换机与原始交换机或队列建立绑定关系。
    • 死信队列: 定义一个死信队列,接收由死信交换机路由的死信。
    • 死信交换机类型: 死信交换机可以是不同类型的交换机,根据具体需求选择合适的类型。
  4. 应用场景:

    • 错误处理: 处理由于消息格式错误等原因导致的死信。
    • 重试机制: 将死信重新发送到其他队列进行重试。
    • 日志记录: 记录死信信息以便进行故障排除和分析。

使用死信交换机可以提高消息系统的健壮性和可靠性,确保无法正常处理的消息得到妥善处理,避免消息的丢失或无法追踪。配置死信交换机需要根据具体消息队列系统的实现进行设置,例如在RabbitMQ中,可以通过设置交换机和队列的参数来实现死信机制。

 


 个人总结:

1.直连交换机只能通过queue发送一个请求,如果需要发送多个请求那么就要进行多个配置;

2.主题交换机可以通过配置多个路由键来实现不同的键进入不同的消费者,如:交换机a,交换机b,现在有一个包含a和b的键那么两个都能进入不同的消费者功能更加强大,并且可以配置通配符,根据通配符 * #  来实现进入不同的消费者;

3. * 星号代表匹配一个单词,# 井号代表匹配一个或多个单词;

4.扇形交换机可以统一发送请求,列入可以运用到,商城活动时统一给用户发送商城活动信息;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1407774.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【计算机网络】UDP协议与TCP协议

文章目录 一、端口号1.什么是端口号2.端口号范围划分3.认识知名端口号(Well-Know Port Number)4.netstat5.pidof 二、UDP协议1.UDP协议端格式2.UDP的特点3.面向数据报4.UDP的缓冲区5.UDP使用注意事项6.基于UDP的应用层协议 三、TCP协议1.TCP协议段格式1.1理解封装解包和分用1.2…

数据结构(C语言版)代码实现(三)——单链表部分代码实现

目录 格式 头文件 宏定义 线性表的单链表存储结构 按位查找 插入元素 删除元素 头插法建立单链表 合并非递减单链表 其他基本操作 完整版 测试代码(主函数) 测试结果 格式 参考 2.3节 线性表的链式表示和实现 头文件 宏定义 #pragma onc…

安卓移动设备使用DS file文件管理工具远程访问本地群晖NAS文件

文章目录 1. 群晖安装Cpolar2. 创建TCP公网地址3. 远程访问群晖文件4. 固定TCP公网地址5. 固定TCP地址连接6. 结语 DS file 是一个由群晖公司开发的文件管理应用程序,主要用于浏览、访问和管理存储在群晖NAS(网络附加存储)中的文件。这个应用…

小模型也能COT

前两章我们分别介绍了COT的多种使用方法以及COT的影响因素。这一章更多面向应用,既现实场景中考虑成本和推理延时,大家还是希望能用6B的模型就不用100B的大模型。但是在思维链基础和进阶玩法中反复提到不论是few-shot还是zero-shot的思维链能力似乎都是1…

‘cnpm‘ 不是内部或外部命令,也不是可运行的程序

一、问题 昨天用npm 安装环境,实在太慢了,就想用cnpm,然后发现提示‘cnpm 不是内部或外部命令,也不是可运行的程序。 看了很多方法,选择了下面这个,运气好到爆棚,就直接可以用了。其他的方法暂未去了解。先…

【极数系列】Flink 初相识(01)

# 【极数系列】Flink 初相识(01) 引言 Flink官网:https://flink.apache.org/ Flink版本:https://flink.apache.org/blog/ Flink文档:https://ci.apache.org/projects/flink/flink-docs-release-1.12/ Flink代码库…

shell脚本-条件测试、

一.条件测试 1.( ) 和 { } ()会进/data ,开启子shell { } 直接切过去了,不开子shell 小案例: 2. test 命令 测试特定的表达式是否成立,当条件成立,测试语句的返回值为0&#xff…

[BUG] Authentication Error

前言 给服务器安装了一个todesk,但是远程一直就是,点击用户,进入输入密码界面,还没等输入就自动返回了 解决 服务器是无桌面版本,或者桌面程序死掉了,重新安装就好 sudo apt install xorg sudo apt inst…

PIL笔记:通道+模式+坐标系统+基本图像操作

PIL Python Imaging Library,Python的图像处理核心库 通道bands 灰度图片是单通道组成 彩色图片是三通道RGB组成 真彩色图片是四通道RGBA组成 模式 RGB RGBA … 坐标系统 左上角为原点(0, 0) 图像操作 显示图像 show 创建图像 open()打开图像new()创建I…

嵌入式学习-C++-Day1

嵌入式学习-CDay1 一、思维导图 二、作业 1.提示并输入一个字符串&#xff0c;统计该字符中大写、小写字母个数、数字个数、空格个数以及其他字符个数&#xff08;要求使用C风格字符串完成&#xff09; #include <iostream> #include <string.h>using namespace…

shopee母婴选品:Shopee平台上进行母婴类目的选品

在Shopee平台上进行母婴类目的选品时&#xff0c;卖家可以通过一些策略来提高产品的市场竞争力和销售业绩。下面将详细介绍这些策略。 先给大家推荐一款shopee知虾数据运营工具知虾免费体验地址&#xff08;复制浏览器打开&#xff09;&#xff1a;D。dDqbt。Com/JU5o知虾是Sh…

考研C语言刷题基础篇之分支循环结构基础(二)

目录 第一题分数求和 第二题&#xff1a;求10 个整数中最大值 第三题&#xff1a;在屏幕上输出9*9乘法口诀表 第四题&#xff1a;写一个代码&#xff1a;打印100~200之间的素数 第五题&#xff1a;求斐波那契数的第N个数 斐波那契数的概念&#xff1a;前两个数相加等于第三…

3.Eureka注册中心

3.Eureka注册中心 假如我们的服务提供者user-service部署了多个实例&#xff0c;如图&#xff1a; 大家思考几个问题&#xff1a; order-service在发起远程调用的时候&#xff0c;该如何得知user-service实例的ip地址和端口&#xff1f;有多个user-service实例地址&#xff0…

git clone报错 fatal: unable to fork

1. 问题 git clone gitgithub.com:url-kaist/Quatro.git Cloning into Quatro... fatal: unable to fork 在使用Docker clone 代码时报错 2. 解决方法 查看是否安装openssh&#xff0c; 用以下命令查看系统是否已安装OpenSSH&#xff0c;如果有openssh-client和openssh-serve…

Oracle、MySQL数据库常规命令语法-简易记录(非常规持续更新)

前言:呈现的是非常基础必备命令以及常规关联语法,因涉及到不同数据库其表达都会有所区别,此篇纯属做个仓库记录更非常规持续更新,专业人士可忽略,且看且珍惜… MySQL: 关系型数据库、重点开源、支持大型规模、标准SQL数据语言、多平台多架构、高可用集群、可定制开发等…

php基础学习之变量

php使用变量的必要性 PHP 是一种动态网站开发的脚本语言&#xff0c;动态语言特点是交互性&#xff0c;会有数据的传递&#xff0c;而 PHP作为“中间人”&#xff0c;需要进行数据的传递&#xff0c;传递的前提就是 PHP 能自己存储数据(临时存储) php变量的命名规则 必须以do…

邯郸银行2023年营收、利润双降:四季度亏损超1亿元,承压明显

近日&#xff0c;邯郸银行发布《2024年度同业存单发行计划》&#xff0c;披露了2023年部分财务数据。信息显示&#xff0c;邯郸银行2023年实现营业收入34.03亿元&#xff0c;同比下降0.98%&#xff1b;净利润6.21亿元&#xff0c;同比下降58.51%。 而结合此前的财务数据测算可知…

grid布局,flex布局实现类似响应式布局的效果

一. grid布局 实现代码 <!DOCTYPE html> <html lang"en"><head><style>.box {display: grid;grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); /*自动填充&#xff0c;最小宽度300px*/justify-content: space-between;gap:…

CC工具箱使用指南:【平差工具】

一、简介 平差是一个摘自英文单词“adiustment”的中文翻译&#xff0c;它最初源于土地测量工程&#xff0c;并在后来广泛应用于各个测量领域在传统的测量中&#xff0c;由于各种误差的存在&#xff0c;例如仪器、人为、大地形态等因素&#xff0c;所得到的测量结果是不完全准…

Android开发之部署opencv4

1 新建一个空项目 不再多说 2从官网下载opencv https://opencv.org/releases/ 下载opencv-4.9.0-android-sdk 3 导入模块 点击file->new->Import Module选择解压之后的opencv-android-sdk文件夹中的SDk文件夹&#xff0c;并将:sdk修改为:opencv&#xff08;我的已安…