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

目录

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

交换机的作用:

交换机的类型:

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

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

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

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

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

 个人总结:


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


交换机的作用:

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

交换机的类型:

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

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

//--------直连交换机@Beanpublic Queue queue1() {return new Queue("queue1");}@Beanpublic Queue queue2() {return new Queue("queue2");}@Beanpublic DirectExchange directExchange(){return new DirectExchange("exchange1");}@Beanpublic Binding binding01(){return BindingBuilder.bind(queue1()).to(directExchange()).with("aa");}@Beanpublic Binding binding02(){return BindingBuilder.bind(queue2()).to(directExchange()).with("bb");}

 消费者接受信息

@Component
@SuppressWarnings("all")
@Slf4j
@RabbitListener(queues = "queue1")
public class ReceiverQ1 {@RabbitHandlerpublic void process(String msg) {log.warn("q1接收到:" + msg);}
}

测试

@RestController
public class TestController {@Autowiredprivate AmqpTemplate template;@Autowiredprivate 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// 一个队列可以用多个绑定键@Beanpublic TopicExchange topicExchange(){return  new TopicExchange("topicExchange");}@Beanpublic Binding binding03(){return BindingBuilder.bind(queue1()).to(topicExchange()).with("*.*.aa");}@Beanpublic Binding binding04(){return BindingBuilder.bind(queue2()).to(topicExchange()).with("*.*.bb");}@Beanpublic Binding binding05(){return BindingBuilder.bind(queue1()).to(topicExchange()).with("mq.#");}@Beanpublic Binding binding06(){return BindingBuilder.bind(queue2()).to(topicExchange()).with("mq.#");}

测试


@RestController
public class TestController {@Autowiredprivate AmqpTemplate template;@Autowiredprivate ObjectMapper objectMapper;@RequestMapping("/send4")public String send4(String rex){template.convertAndSend("topicExchange",rex,"hello");return "🤣";}}

 


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

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

//--------------扇形交换机// 广播,群发//它上面的队列不需要binding key@Beanpublic FanoutExchange fanoutExchange(){return new FanoutExchange("fanoutExchange");}@Beanpublic Binding binding07(){return BindingBuilder.bind(queue1()).to(fanoutExchange());}@Beanpublic 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.mzph.cn/news/642708.shtml

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

相关文章

vue给components动态添加组件

在Vue中&#xff0c;可以使用v-bind指令来动态地将组件添加到其他组件上。 首先&#xff0c;需要定义一个包含所有可能的子组件的数组或对象。然后&#xff0c;通过计算属性&#xff08;computed property&#xff09;根据条件选择要显示的组件。最后&#xff0c;使用<comp…

利用Python与Flet写一个图片无损放大软件

一、前言&#xff1a; 将上传的图片无损放大2倍、4倍、8倍 二、利用Flet写个前端页面&#xff1a; 三、前端页面代码&#xff1a; page.title "图片无所放大"page.vertical_alignment "center"page.window_width 500 # windows width is 200 pxpage…

《小学生作文辅导》期刊投稿邮箱

《小学生作文辅导》是国家新闻出版总署批准的正规教育类期刊&#xff0c;适用于全国各小学语文老师事业单位及个人&#xff0c;具有原创性的学术理论、工作实践、科研成果和科研课题及相关领域等人员评高级职称时的论文发表&#xff08;单位有特殊要求除外&#xff09;。 栏目…

VMware workstation平台下配置Fedora-Server-39-1.5虚拟机网络

VMware workstation平台下配置Fedora-Server-39-1.5虚拟机网络 Fedora包含的软件以自由及开放源码许可来发布&#xff0c;并旨在成为该技术领域的领先者。Fedora在专注创新、抢先集成新技术、与上游Linux社区紧密工作方面拥有良好名声。该文档适用于在VMware workstation平台下…

动态规划学习——赢得最大数

题目&#xff1a; 给一个数组&#xff0c;表示纸牌&#xff0c;每张纸牌有一定的大小 两个人依次选择左边或者右边的纸牌&#xff0c;获得相应的点数 最后点数较大的为胜者 注&#xff1a;两个人都是聪明人&#xff0c;意味着拿牌会选择让自己获得更多的&#xff0c;让对方获得…

小土堆pytorch学习笔记001

1、Pytorch环境的配置与安装。 &#xff08;1&#xff09;建议安装&#xff1a;Anaconda &#xff08;2&#xff09;检查显卡&#xff1a;GPU &#xff08;3&#xff09;管理环境&#xff08;不同版本的pytorch 版本不同&#xff09;&#xff1a; conda create -n pytorch…

Android单元测试(五):网络接口测试

温馨提示&#xff1a;如果你不太熟悉单元测试&#xff0c;可以先看下之前四篇基础框架使用。便于你更好的理解下面的内容。 在平日的开发中&#xff0c;我们用后台写好给我们接口去获取数据。虽然我们有一些请求接口的工具&#xff0c;可以快速的拿到返回数据。但是在一些异常情…

xxe漏洞之scms靶场漏洞

xxe-scms 代码审核 &#xff08;1&#xff09;全局搜索simplexml_load_string simplexml_load_string--将XML字符串解释为对象 &#xff08;2&#xff09;查看源代码 ID1 $GLOBALS[HTTP_RAW_POST_DATA]就相当于file_get_contents("php://input"); 因此这里就存…

Java面试题之基础篇

文章目录 一&#xff1a;谈谈你对面向对象的理解二&#xff1a;JDK、JRE、JVM三者区别和联系三&#xff1a;和equals比较四&#xff1a;hashCode与equals五&#xff1a;final六&#xff1a;String、StringBuffer、StringBuilder七&#xff1a;重载与重写的区别&#xff1f;八&a…

RSI的c#计算,同花顺

同花顺的RSI是移动平滑计算&#xff0c;折腾我半天了。为了算当前值&#xff0c;一定要把前面的值记下来。真麻烦 ///LC : REF(CLOSE,1); /// 当日上涨平均数 前一日涨幅平均数*5/6 当日涨幅/6 &#xff08;若某日下跌时&#xff0c;则当日涨幅记为0&#xff09; …

慎用“from pwn import *”!和re库findall方法重名引发的问题

今天搓一个sage脚本遇到一个很无语的问题&#xff0c;经过调试&#xff0c;发现是pwntools库中的findall方法和re库中的findall方法重名导致的。这两个findall方法的用法完全不一样&#xff0c;稍有不慎就会踩坑。 文章目录 区分问题引发如何规避 区分 re 是 Python 中用于处理…

算法设计与分析实验1:利用减治法和分治法来处理同一个问题

目录 实验1 利用减治法和分治法来处理同一个问题 一、实验目的 二、实验内容和要求 【俄式乘法函数原型及功能说明】 【核心函数实现代码及时间复杂度与空间复杂度分析】 (1)俄式乘法实现代码 (2)时间复杂度:O(log(底数为2)n) (3)空间复杂度:无递归算法,为…

【unity】unity中如何随机选取list中的对象

【背景】 有一组Prefab,在游戏中希望随机Spawn实例。 【代码示例】 在脚本中创建一个List,在Unity编辑器中将需要生成的待选Prefab放入List中。通过随机Index来随机获取List元素实现目标。 using UnityEngine; using System.Collections.Generic;public class RandomSele…

mockjs使用(2)

mockjs使用&#xff08;1&#xff09; 4、Mock 4.1 Mock.mock() 根据数据模版生成模拟数据 Mock.mock( rurl?, rtype?, template|function(options) )问号代表该参数不必填 4.1.1 各参数及其默认值 rurl: 不必填。表示需要拦截的URL&#xff0c;可以使URL字符串或URL正…

Java-SPI机制

SPI基本概念 SPI&#xff08;Service Provider Interface&#xff09;是一种服务发现机制&#xff0c;为某个接口寻找服务实现的机制。这有点类似 IoC 的思想&#xff0c;将装配的控制权移交到了程序之外。SPI 将服务接口和具体的服务实现分离开来&#xff0c;将服务调用方和服…

Linux 强大的网络命令:nc命令操作方法

Netcat&#xff08;或简称nc&#xff09;是一个强大的网络工具&#xff0c;它在Linux系统中广泛使用&#xff0c;可用于创建各种网络连接。它被描述为"网络的瑞士军刀"&#xff0c;因为它的功能非常灵活&#xff0c;可以在网络中执行多种任务。 在大多数Linux发行版中…

【笔记】Helm-3 主题-14 Helm版本支持策略

Helm版本支持策略 该文档描述了在Helm和Kubernetes之间的最大版本偏差。 支持的版本 Helm的版本用x.y.z描述&#xff0c;x是主版本&#xff0c;y是次版本&#xff0c;z是补丁版本&#xff0c;遵循 语义化版本 术语。 Semantic Versioning 2.0.0 | Semantic Versioning Helm项…

flutter 中使用flutter_slidable 实现左滑显示删除、修改菜单,仿微信

flutter pub add flutter_slidable导入 import package:flutter_slidable/flutter_slidable.dart;使用 import package:flutter/material.dart; import package:flutter_slidable/flutter_slidable.dart;void main() > runApp(const MyApp());class MyApp extends Statele…

速锐得解码匹配吉利枫叶80V/60S远程控制汽车应用B端市场

吉利枫叶80V/60S这两款车平时是不多见的&#xff0c;因为吉利枫叶的定位就的B端市场&#xff0c;包括了公务用车、共享出行、网约车、大客户定制&#xff0c;所以&#xff0c;好风凭借力&#xff0c;送我上青云&#xff0c;吉利在默默地发着一笔小财&#xff0c;或者说拓宽了更…

Go 复合数据类型

1. 数组&#xff08;array&#xff09;&#xff08;OK&#xff09; 数组数组的概念数组是具有固定长度且拥有零个或多个相同数据类型元素的序列 i. 元素的数据类型相同 ii. 长度固定的序列 iii. 零个或多个元素的序列 与 slice 对比 由于数组的长度固定&#xff0c;所以在 G…