RabbitMQ 备份交换机和死信交换机

为处理生产者生产者将消息推送到交换机中,交换机按照消息中的路由键即自身策略无法将消息投递到指定队列中造成消息丢失的问题,可以使用备份交换机。
为处理在消息队列中到达TTL的过期消息,可采用死信交换机进行消息转存。
通过上述描述可知,备份交换机和死信交换机处理的场景不同。备份交换机是处理未被路由的消息,死信交换机是处理队列中过期的消息。但是,它们都是为了避免消息丢失提供的一种手段。

备份交换机

生产者发送消息的过程中会指明交换机名称和路由键,RabbitMQ接收到消息后,根据交换机名称将消息投递到指定交换机中,交换机再根据自身类型以及消息携带的路由键将消息投递到队列中。当无法路由到队列时,并且该交换机存在备份交换机,则该交换机将该消息投递给其备份交换机进行处理。
备份交换机接收到消息后依旧根据其自身类型和消息路由键进行消息投递,如果依旧无法匹配到队列中,则该消息被丢失。该过程中的具体流程如下图所示。
备份交换机

备份交换机的实现

备份交换机的实现方式包括:生命交换机时通过参数配置和通过策略进行配置。申明交换机时配置备份交换机如下所示。

 Map<String, Object> args = new HashMap<>();
 args.put("alternate-exchange","myAe");      
 channel.exchangeDeclare("normalExchange","direct",true,false,args);
 channel.exchangeDeclare("myAe","fanout",true,false,null);

通过上述代码即实现了声明两个交换机,其中交换机myAe是normalExchange的备份交换机。备份交换机可以理解为一个普通交换机,备份交换机自身并不知晓自己是备份交换机,当某个消息无法被路由到队列中时,该交换机会查找自己的备份交换机,如果存在则将消息交由备份交换机进行处理。
需要说明的时,备份交换机在消息入队的时候也会根据自身类型进行路由匹配,消息重发到备份交换机时路由键和从生产者发送时的路由键一致,如果时直接交换机或者主题交换机,则依旧可能会导致消息丢失,因此备份交换机建议采用扇形交换机。
备份交换机存在以下特殊情况

  • 如果备份交换机和mandatory参数一起使用,则mandatory参数无效。
  • 如果备份交换机不存在,则消息丢失且生产者和RabbitMQ都不会有异常出现。
  • 如果备份交换机没有绑定队列,则消息丢失且生产者和RabbitMQ都不会有异常出现。
  • 如果备份交换机依旧无法将消息路由到队列,则消息丢失且生产者和RabbitMQ都不会有异常出现。

死信交换机

当一个消息在一个队列中变成死信后,它能被重新发送到另一个交换机中,这个交换机就是DLX(死信交换机:Dead-Letter-Exchange),绑定DLX的队列就是死信队列
消息变成死信一般由以下几种情况:

  • 消息被消费者拒绝,并且设置不可重新入队
  • 消息过期(TTL)
  • 队列达到最大长度。

根据上述描述,队列中的消息变成死信后将转发给死信交换机,因此死信交换机的设置是在声明队列的过程中完成的。死信交换机和备份交换机类似,其自身并不知道自己是死信交换机,仅指定其为死信交换机的队列知道其死信交换机身份的存在,本质上死信交换机和正常交换机并不存在区别。
死信交换机的设置存在声明队列时设置和通过策略设置。声明队列时设置如下所示:

Map<String, Object> args = new HashMap<>();
// 声明该队列的死信交换机为”dlx_exchange“
args.put("x-dead-letter-exchange","dlx_exchange");
// 声明死信交由死信交换机处理时将路由键替换为dlx-routing-key
args.put("x-dead-letter-routing-key","dlx-routing-key");
channel.queueDeclare("queue",false,false,false,args);

死信交换机存在以下特殊情况

  • 如果死信交换机不存在,则消息丢失且RabbitMQ都不会有异常出现。
  • 如果死信交换机没有绑定队列,则消息丢失且RabbitMQ都不会有异常出现。
  • 如果死信交换机依旧无法将消息路由到队列,则消息丢失且RabbitMQ都不会有异常出现。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[vue-element-admin]下载与安装

一、环境搭建 1 nodejs 源码地址 sudo apt install build-essential # 内含gcc g make等全家桶git clone git://github.com/nodejs/node.git # 下载源码 cd node sudo ./config sudo make && make install # 编译 node -v # 查看是否编译成功二、遇见的问题 问题…

【606. 根据二叉树创建字符串】

目录 1.题目描述2.算法思想3.代码实现 1.题目描述 这道题的重点其实就是要省去不影响映射的括号。如&#xff1a; 2.算法思想 3.代码实现 class Solution { public:string _tree2str(TreeNode* root,string& ret){if(rootnullptr){return "";}retto_string(ro…

无人车沿着指定线路自动驾驶与远程控制的实践应用

有了前面颜色识别跟踪的基础之后&#xff0c;我们就可以设定颜色路径&#xff0c;让无人车沿着指定线路做自动驾驶了&#xff0c;视频&#xff1a;PID控制无人车自动驾驶 有了前几章的知识铺垫&#xff0c;就比较简单了&#xff0c;也是属于颜色识别的一种应用&#xff0c;主要…

数据结构——时间复杂度和空间复杂度

1.算法效率 2.时间复杂度 3.空间复杂度 4. 常见时间复杂度以及复杂度oj练习 1.算法效率 1.1 如何衡量一个算法的好坏 如何衡量一个算法的好坏呢&#xff1f;比如对于以下斐波那契数的计算 long long Fib(int N) { if(N < 3) return 1; return Fib(N-1) Fib(N-2); }我们看到…

火爆全网,HttpRunner自动化测试框架-CSV文件数据(详细总结)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 当数据量比较大的…

使用iPad和Procreate绘制古风插画设计教程

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 前言 随着数字绘画工具…

四、web应用程序技术——HTTP

文章目录 1 HTTP请求2 HTTP响应3 HTTP方法4 URL5 HTTP消息头5.1 常用消息头5.2 请求消息头5.3 响应消息头 6 cookie7 状态码8 HTTP代理9 HTTP身份验证 HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;是访问万维网使用的核心通信协议&…

【JavaEE进阶】Spring 更简单的读取和存储对象

文章目录 一. 存储Bean对象1. 配置扫描路径2. 添加注解存储 Bean 对象2.1 使用五大类注解存储Bean2.2 为什么要有五大类注解&#xff1f;2.3 有关获取Bean参数的命名规则 3. 使用方法注解储存 Bean 对象3.1 方法注解储存对象的用法3.2 Bean的重命名3.3 同⼀类型多个 Bean 报错 …

国产芯力特Mini LIN SBC SIT1028Q应用方案,可替代TJA1028

SIT1028Q是一款内部集成高压LDO稳压源的本地互联网络&#xff08;LIN&#xff09;物理层收发器&#xff0c;可为外部ECU&#xff08;Electronic Control Unit&#xff09;微控制器或相关外设提供稳定的5V/3.3V电源&#xff0c;该LIN收发器符合LIN2.0、LIN2.1、LIN2.2、LIN2.2A、…

应急响应-linux挖矿病毒的实战处置

0x01 服务器现状分析 客户描述服务器卡顿&#xff0c;切通过搜索引擎进去该官网跳转非法页面&#xff0c;但本地访问无异常 0x02 信息收集 通过进程占用情况cpu功率拉满&#xff0c;确定被植入挖矿病毒文件 qq 且存在计划任务update.sh&#xff1a;crontab -l 将该文件上传沙…

Java课题笔记~ HTTP协议(请求和响应)

Servlet最主要的作用就是处理客户端请求&#xff0c;并向客户端做出响应。为此&#xff0c;针对Servlet的每次请求&#xff0c;Web服务器在调用service()方法之前&#xff0c;都会创建两个对象 分别是HttpServletRequest和HttpServletResponse。 其中HttpServletRequest用于封…

【WebService】使用postman调用WebService方法

1、需求 公司原来有一个项目使用的是WebService&#xff0c;想模拟一下怎么调用WebService的方法&#xff0c;使用postman调用怎么调用。 2、postman方式 接口&#xff1a;http://127.0.0.1:8080/SecurityWebService/SecurityCommand?wsdl 对应你的代码配置&#xff1a; …

模拟实现消息队列项目(系列4) -- 服务器模块(内存管理)

目录 前言 1. 创建MemoryDataCenter 2. 封装Exchange 和 Queue方法 3. 封装Binding操作 4. 封装Message操作 4.1 封装消息中心集合messageMap 4.2 封装消息与队列的关系集合queueMessageMap的操作 5. 封装未确认消息集合waitMessage的操作 6. 从硬盘中恢复数据到内存中 7. Memo…

介绍另外一个容器技术, Apptainer

一说到容器&#xff0c;我们往往会脱口而出&#xff0c; Docker&#xff0c; 实际上Docker 仅仅是Linux 容器化的一种&#xff0c; 今天介绍的Apptainer 就是另外一种容器技术。 那么Apptainer 具体是一个什么东西呢&#xff1f; 跟Docker 有什么区别呢&#xff1f; 首先&#…

【Python】python通过cmd创建虚拟环境(pip方式)

前言&#xff1a; 在window中使用pipenv创建虚拟环境时&#xff0c;虚拟环境默认的位置是在C:\User\Administrator\.virtualenvs\目录下&#xff1b;那如果我们想配置到自定义位置&#xff0c;该如何修改呢&#xff1f;当我们在进行python项目开发的时候&#xff0c;为了不让项…

tcl学习之路(四)(vivado设计分析)

1.FPGA芯片架构中的对象 在打开elaborated/synthesied/implemented的情况下&#xff0c;可使用如下命令获取期望的SLICE。SLICE分为SLICEL和SLICEM&#xff0c;由LUT、FF、MUX、CARRY组成。 set all_slice [get_sites SLICE*] set col_slice [get_sites SLICEX0Y*] set all_sl…

【资料分享】全志科技T507-H工业核心板规格书

1 核心板简介 创龙科技SOM-TLT507是一款基于全志科技T507-H处理器设计的4核ARM Cortex-A53全国产工业核心板&#xff0c;主频高达1.416GHz。核心板CPU、ROM、RAM、电源、晶振等所有元器件均采用国产工业级方案&#xff0c;国产化率100%。 核心板通过邮票孔连接方式引出MIPI C…

【爱书不爱输的程序猿】内网的摄像头,远程进行访问的方式方法

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 快速远程访问内网的摄像头【内网穿透】 前言一、快速远程访问内网的摄像头1. 打开“允许远程桌面”开关2. 建立TCP-IP隧道3. 获取生成的TCP-IP隧道地址4. 连接另一台电脑4.1 取得该…

Python自动化测试基础必备知识点总结

目录 一、自动化测试的概念 二、Python自动化测试基础必备知识点 一、自动化测试的概念 性能系统负载能力稳定性过载操作下的系统瓶颈自动化测试&#xff0c;使用程序代替人工&#xff0c;可以提高测试效率性&#xff0c;自动化测试能自动化使用代码模拟大量用户&#xff0c…

java+springboot+mysql小区宠物管理系统

项目介绍&#xff1a; 使用javaspringbootmysql开发的小区宠物管理系统&#xff0c;系统包含超级管理员&#xff0c;系统管理员、用户角色&#xff0c;功能如下&#xff1a; 超级管理员&#xff1a;管理员管理&#xff1b;用户管理&#xff1b;宠物分类&#xff1b;宠物管理&…