RabbitMQ 高级特性——死信队列

在这里插入图片描述

文章目录

  • 前言
  • 死信队列
    • 什么是死信
    • 常见面试题
    • 死信队列的概念:
    • 死信的来源(造成死信的原因有哪些)
    • 死信队列的应用场景

前言

前面我们学习了为消息和队列设置 TTL 过期时间,这样可以保证消息的积压,那么对于这些过期了的消息,它们都去了哪里呢?可以直接将这些消息丢弃,也可以将这些消息单独放在一个叫做 “死信队列” 这样的结构中,那么什么是死信队列呢?这篇文章将为大家介绍一下什么是死信队列。

死信队列

什么是死信

死信(Dead Letter,简称DL)指的是那些由于某些原因无法被正常消费的消息。

那么死信队列就是指存储死信的队列。当消息在一个队列中变成死信之后,它能被重新发送到另一个交换机中,这个交换机就是 DLX(Dead Letter Exchange),绑定 DLX 的队列,就称为死信队列 DLQ(Dead Letter Queue)。

在这里插入图片描述

什么样的消息最终才会变成死信呢?

  1. 消息被拒绝,并且设置这个被拒绝的消息不重新进入队列
  2. 消息过期
  3. 队列达到最大长度

如何声明死信交换机和死信队列

包含两个部分:

  • 声明正常的交换机和队列
  • 声明死信交换机和死信队列
public static final String NORMAL_EXCHANGE = "normal.exchange";
public static final String NORMAL_QUEUE = "normal.queue";
public static final String DL_EXCHANGE = "dl.exchange";
public static final String DL_QUEUE = "dl.queue";

声明交换机、队列以及交换机和队列的绑定关系:

@Configuration
public class DLconfig {
    @Bean("normalExchange")
    public DirectExchange normalExchange() {
        return ExchangeBuilder.directExchange(Constants.NORMAL_EXCHANGE).durable(true).build();
    }

    //将正常队列和死信交换机进行绑定,这是第一这种绑定队列和死信交换机的方法
    @Bean("normalQueue")
    public Queue normalQueue() {
        return QueueBuilder.durable(Constants.NORMAL_QUEUE)
                .deadLetterExchange(Constants.DL_EXCHANGE)
                .deadLetterRoutingKey("dl")
                .build();
    }

	//这是正常队列和死信交换机绑定的第二种方式,将配置信息以键值对的方式传递
	@Bean("normalQueue1")
    public Queue normalQueue1() {
        Map<String,Object> arguments = new HashMap<>();
        arguments.put("x-dead-letter-exchange",Constants.DL_EXCHANGE); //绑定死信交换机
        arguments.put("x-dead-letter-routing-key","dl"); //设置发送给死信交换机的routing key,死信交换机会根据这个routing key将死信传递给指定的死信队列
        return QueueBuilder.durable(Constants.NORMAL_EXCHANGE).withArguments(arguments).build();
    }

    @Bean("normalBinding")
    public Binding normalBinding(@Qualifier("normalQueue") Queue queue, @Qualifier("normalExchange") DirectExchange exchange) {
        return BindingBuilder.bind(queue).to(exchange).with("normal");
    }

    @Bean("dlExchange")
    public DirectExchange dlExchange() {
        return ExchangeBuilder.directExchange(Constants.DL_EXCHANGE).durable(true).build();
    }

    @Bean("dlQueue")
    public Queue dlQueue() {
        return QueueBuilder.durable(Constants.DL_QUEUE).build();
    }

	@Bean("dlBinding")
    public Binding dlBinding(@Qualifier("dlQueue") Queue queue,@Qualifier("dlExchange") DirectExchange exchange) {
        return BindingBuilder.bind(queue).to(exchange).with("dl");
    }
}

制造死信条件:

前面说了造成死信的原因有三个:1. 消息过期 2. 消息被消费者拒绝且消息不重新进入队列 3. 队列到达最大长度之后,再进入队列的消息就会成为死信。

那么我们制造出死信,就是让队列中的消息数达到最大的长度:

@Bean("normalQueue")
public Queue normalQueue() {
    return QueueBuilder.durable(Constants.NORMAL_QUEUE)
            .deadLetterExchange(Constants.DL_EXCHANGE)
            .deadLetterRoutingKey("dl")
            .maxLength(10)
            .build();
}

然后我们的生产者一次产生 20 条消息:

@RequestMapping("/dl")
public String dl() {
    for (int i = 0; i < 20; i++) {
        rabbitTemplate.convertAndSend(Constants.NORMAL_EXCHANGE,"normal","rabbitmq dl" + i);
    }
    return "消息发送成功";
}

NORMAL_QUEUE 我们就先不设置消费者,然后为死信队列设置消费者,看看超出队列长度的消息是否成为了死信最终到达了死信队列:

@Component
public class DLListener {
    @RabbitListener(queues = Constants.DL_QUEUE)
    public void listener(Message message, Channel channel) {
        System.out.println("死信消费者接收到消息:" + message + channel);
    }
}

在这里插入图片描述
在这里插入图片描述

常见面试题

死信队列的概念:

RabbitMQ中的死信队列(Dead Letter Queue,简称DLQ)是一种特殊的队列机制,用于处理那些因为某些原因无法被正常消费的消息。这些消息在RabbitMQ中被称为“死信”。死信队列的主要目的是防止消息在系统中永久丢失,同时提供一个机制来对这些无法被消费的消息进行后续处理。

死信的来源(造成死信的原因有哪些)

  1. 消息被拒绝
  • 消费者显式拒绝:消费者可以使用RabbitMQ的basic.reject或basic.nack方法拒绝消息。如果requeue参数被设置为false,则消息不会被重新放回队列,而是会被发送到死信队列(如果配置了的话)。
    消费者超时未处理:在某些情况下,如果消费者在一定时间内未能处理消息(如因为性能问题或长时间未响应),消息也可能被视为被拒绝。
  1. 消息过期
  • 设置TTL(Time To Live):RabbitMQ允许为消息或队列设置生存时间(TTL)。如果消息在设置的TTL时间内未被消费,它将被视为过期消息,并可能被发送到死信队列(取决于队列的配置)。
  1. 队列达到最大长度
  • 队列长度限制:RabbitMQ允许为队列设置最大长度限制(可以是消息数量或消息总字节数)。当队列中的消息数量或总字节数达到此限制时,新的消息可能无法被添加到队列中。如果配置了死信队列,则某些消息(如最老的消息)可能会被丢弃或发送到死信队列。

死信队列的应用场景

  1. 错误消息的重试与恢复
    当消息因为消费者代码错误、外部系统不可用或其他暂时性问题而无法被处理时,可以将这些消息发送到死信队列。然后,可以编写专门的消费者来从死信队列中拉取消息,并根据需要进行重试或人工干预。例如,可以设置重试策略,如延迟重试、增加重试次数限制等,以减少因瞬时故障而导致的消息丢失。

  2. 异常消息的分析与监控
    死信队列中的消息通常是因为某些异常或错误而产生的。通过监控和分析这些消息,可以及时发现系统中的问题,如消费者代码中的逻辑错误、外部系统的不可用状态等。这有助于快速定位问题并采取相应的解决措施,保证系统的稳定性和可靠性。

  3. 消息过期处理
    对于设置了TTL(Time To Live)的消息,如果它们在指定的时间内未被消费,将被发送到死信队列。这可以用于处理那些需要在一定时间内得到响应但未能及时处理的消息。例如,在订单系统中,如果某个订单状态更新消息在一定时间内未被处理,可以将其发送到死信队列,并由专门的消费者进行过期处理,如取消订单、发送通知等。

  4. 消息审计与合规性检查
    在某些业务场景中,需要对消息进行审计或合规性检查。通过将无法通过审计或合规性检查的消息发送到死信队列,可以确保只有符合要求的消息被进一步处理。这有助于满足行业监管要求,保护企业利益,并避免潜在的法律风险。

  5. 消息路由与分流
    在某些复杂的消息系统中,可能需要根据消息的不同属性或处理结果将其路由到不同的队列中。通过使用死信队列作为中间环节,可以实现更灵活的消息路由和分流策略。例如,可以将无法被当前消费者处理的消息发送到死信队列,并由另一个消费者进行进一步处理或路由。

  6. 消息备份与恢复
    在某些情况下,可能需要将重要消息进行备份以防止数据丢失。通过将消息发送到死信队列(作为备份队列),可以在系统发生故障或数据丢失时进行恢复。这有助于确保数据的安全性和完整性。

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

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

相关文章

数据结构-4.6.KMP算法(旧版下)-朴素模式匹配算法的优化

一.绪论&#xff1a; 当主串字符和模式串字符不匹配时会执行jnext[j]来改变模式串的指针&#xff0c;但主串的指针不变。 二.求模式串的next数组&#xff1a; 1.例一&#xff1a; 如模式串abcabd&#xff0c;当第六个字符d匹配失败时&#xff0c;此时主串中前五个字符abcab都…

连锁店线下线上一体化收银系统源码

近年来线下线上一体化已经成为很多连锁门店追求的方向。其中&#xff0c;线下门店能够赋予品牌发展的价值依然不可小觑。在线下门店中&#xff0c;收银系统可以说是运营管理的关键工具&#xff0c;好的收银系统能够为品牌门店赋能。对于连锁品牌而言&#xff0c;对收银系统的要…

软媒市场新蓝海:软文媒体自助发布与自助发稿的崛起

在信息时代的浪潮中,软媒市场以其独特的魅力和无限的潜力,成为了企业营销的新宠。随着互联网的飞速发展,软文媒体自助发布平台应运而生,为企业提供了更加高效、便捷的营销方式。而自助发稿功能的加入,更是让软媒市场的蓝海变得更加广阔。 软媒市场的独特价值 软媒市场之所以能…

Android Studio Koala中Kotlin引入序列化Parcelable

找了一堆资料没有新构建序列化的方法&#xff0c;踩坑经历如下&#xff1a; 前提是使用Kotlin创建的项目 之前的build.gradle版本写法如下&#xff1a; 但是新版Android Studio Koala使用序列化模式发生了改变&#xff0c;如下&#xff1a; 测试成功如下&#xff1a; 发出来…

【万字长文】Word2Vec计算详解(三)分层Softmax与负采样

【万字长文】Word2Vec计算详解&#xff08;三&#xff09;分层Softmax与负采样 写在前面 第三部分介绍Word2Vec模型的两种优化方案。 【万字长文】Word2Vec计算详解&#xff08;一&#xff09;CBOW模型 markdown行 9000 【万字长文】Word2Vec计算详解&#xff08;二&#xff0…

PyCharm+ssh跳板机+服务器

PyCharmssh跳板机服务器 文章目录 PyCharmssh跳板机服务器准备工作登录服务器查看CUDA查看conda创建虚拟环境 前言配置ssh免密登录设置ssh隧道配置pycharm测试第一种第二种 传输数据 准备工作 登录服务器 直接ssh连接就行,在终端(命令行)直接输入下面命令: 跳板机&#xff1…

windows系统更新升级node指定版本【避坑篇!!!亲测有效】(附带各版本node下载链接)一定看到最后!不用删旧版!

Node.js 是一个开源、跨平台的 JavaScript 运行时环境&#xff0c;广泛应用于服务器端和网络应用的开发。随着 Node.js 版本的不断更新&#xff0c;我们可能需要升级到特定版本以满足项目需求或修复安全漏洞。又或者是学习开发另外一个新项目&#xff0c;新项目对Node版本要求更…

数学建模算法与应用 第12章 现代优化算法

目录 12.1 粒子群优化算法 Matlab代码示例&#xff1a;粒子群优化算法求解函数最小值 12.2 遗传算法 Matlab代码示例&#xff1a;遗传算法求解函数最小值 12.3 蚁群算法 Matlab代码示例&#xff1a;蚁群算法求解旅行商问题 12.4 Matlab 遗传算法工具 使用遗传算法工具箱…

基于Python+sqlite3实现(Web)图书管理系统

项目名称&#xff1a;LibraryManagementSystem 一、系统目标 使用了Python作为语言,以django为后台&#xff0c;sqlite3作为数据库&#xff0c;UI基于bootstrap的图书管理系统&#xff0c;模拟图书管理的真实场景&#xff0c;考虑客观需求&#xff0c;界面简洁、操作方便&…

Android Studio实现安卓图书管理系统

获取源码请点击文章末尾QQ名片联系&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动 171安卓小说 1.开发环境 android stuido3.6 jak1.8 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.图书列表 3.图书借阅 4.借阅列表 3.系统截图

Go编译为可执行文件

在window下打包成其他系统可运行的文件 1.在window下打包成window下可执行文件 在项目main.go同级目录下&#xff0c;逐条执行以下命令 set CGO_ENABLED0 set GOOSwindows set GOARCHamd64 go build -o main-windows.exe main.go 2.在window下打包成linux 在项目main.go同级目…

appium中的uiautomatorviewer显示的界面为横屏解决方法

uiautomatorviewer显示的界面为横屏解决方法 解决方法&#xff1a; 修改模拟器的分辨率&#xff0c;比如540:900就可解决了

鸿蒙NEXT开发-面试题库(最新)

注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注&#xff0c;博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…

智能化叉车作业安全高效监控管理系统方案

在物流作业中&#xff0c;智能叉车管理系统的引入&#xff0c;不仅极大地提升了作业效率&#xff0c;还显著增强了作业安全性&#xff0c;为物流行业的现代化转型注入了强劲动力。 1、产品简介 2023A智能叉车管理系统是用于工业车辆安全监控管理的车载终端&#xff0c;具有快…

【数据结构与算法】线性表顺序存储结构

文章目录 一.顺序表的存储结构定义1.1定义1.2 图示1.3结构代码*C语言的内存动态分配 二.顺序表基本运算*参数传递2.1建立2.2初始化(InitList(&L))2.3销毁(DestroyList(&L))2.4判断线性表是否为空表(ListEmpty(L))2.5求线性表的长度(ListLength(L))2.6输出线性表(DispLi…

根据请求错误的状态码判断代理配置问题

SafeLine&#xff0c;中文名 “雷池”&#xff0c;是一款简单好用, 效果突出的 Web 应用防火墙(WAF)&#xff0c;可以保护 Web 服务不受黑客攻击。 雷池通过过滤和监控 Web 应用与互联网之间的 HTTP 流量来保护 Web 服务。可以保护 Web 服务免受 SQL 注入、XSS、 代码注入、命…

如何高效撰写和发表SCI论文

第一章、论文写作准备即为最关键 1、科技论文写作前期的重要性及其分类 2、AI工具如何助力学术论文 3、研究主题确定及提高创新性 兴趣与背景&#xff1a;选择一个您感兴趣且有背景知识的研究领域。 创新性&#xff1a;选题和研究设计阶段如何提高学术创新性的方法。 研究缺…

yolov5-7.0模型DNN加载函数及参数详解(重要)

yolov5-7.0模型DNN加载函数及参数详解&#xff08;重要&#xff09; 引言yolov5&#xff08;v7.0&#xff09;1&#xff0c;yolov5.h(加载对应模型里面的相关参数要更改)2&#xff0c;main主程序&#xff08;1&#xff09;加载网络&#xff08;2&#xff09;检测推理&#xff0…

QD1-P2 HTML 编辑器:HBuilderX

本节学习&#xff1a; HTML课程内容介绍HBuilderX编辑器的使用 本节视频 www.bilibili.com/video/BV1n64y1U7oj?p2 HTML 内容 基础语法 标签整体架构DOCTYPE 常用标签 标题和水平线段落和换行列表div 和 span格式化标签图片超链接标签表格表单字符实体 编辑器 HBuilder…

解决pyinstaller 打包 ddddocr 库方法

前言 ddddocr 库 在打包成 exe 文件后一直有各种各样的问题。无法运行。 总是提示缺少 onnxruntime_providers_shared.dll 等问题。例如下图: 所以这里总结一下打包解决方法。 方法 1、 第一步,先使用命令打包一次 pyinstaller -F demo.py -p D:\Python38\Lib\site-pac…