RabbitMq死信队列(详解)

news2024/12/1 12:43:47

死信队列的概念


死信(dead message)简单理解就是因为种种原因,无法被消费的信息,就是死信。

有死信,自然就有死信队列。当消息在⼀个队列中变成死信之后,它能被重新被发送到另⼀个交换器中,这个交换器就是DLX( Dead Letter Exchange ),绑定DLX的队列,就称为死信队列(Dead Letter Queue,简称DLQ)。

如图所示工作机制:

消息变成死信⼀般是由于以下几种情况:

1. 消息被拒绝( Basic.Reject/Basic.Nack ),并且设置 requeue 参数为false。

2. 消息过期。

3. 队列达到最大长度。

4. 消息发生异常。


代码案例


声明队列和交换机

包含两部分:

• 声明正常的队列和正常的交换机

• 声明死信队列和死信交换机

死信交换机和死信队列和普通的交换机,队列没有区别。

如代码:

//常量类

//死信队列 
 public static final String DLX_EXCHANGE_NAME = "dlx_exchange";
 public static final String DLX_QUEUE = "dlx_queue";

//普通队列
 public static final String NORMAL_EXCHANGE_NAME = "normal_exchange";
 public static final String NORMAL_QUEUE = "normal_queue";
import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import rabbitmq.Constant;
 /**
 * 死信队列相关配置 
 */

 @Configuration
 public class DLXConfig {
 //死信交换机 
    @Bean("dlxExchange")
   public Exchange dlxExchange(){
    return ExchangeBuilder.topicExchange(Constant.DLX_EXCHANGE_NAME).durable(true).build();
 }
 //2. 死信队列 
 @Bean("dlxQueue")
   public Queue dlxQueue() {
    return QueueBuilder.durable(Constant.DLX_QUEUE).build();
 }
 //3. 死信队列和交换机绑定 Binding 
 @Bean("dlxBinding")
   public Binding dlxBinding(@Qualifier("dlxExchange") Exchange exchange, 
@Qualifier("dlxQueue") Queue queue) {
    return BindingBuilder.bind(queue).to(exchange).with("dlx").noargs();
}
 //正常交换机 
 @Bean("normalExchange")
   public Exchange normalExchange(){
    return ExchangeBuilder.topicExchange(Constant.NORMAL_EXCHANGE_NAME)
          .durable(true)
          .build();
 }
 //正常队列 
 @Bean("normalQueue")
   public Queue normalQueue() {
    return QueueBuilder.durable(Constant.NORMAL_QUEUE).build();
 }
 //正常队列和交换机绑定 Binding 
 @Bean("normalBinding")
   public Binding normalBinding(@Qualifier("normalExchange") Exchange 
     exchange, @Qualifier("normalQueue") Queue queue) {
    return BindingBuilder.bind(queue).to(exchange).with("normal").noargs();
 }
}

正常队列绑定死信交换机

当这个队列中存在死信时,RabbitMQ会自动的把这个消息重新发布到设置的DLX上,进而被路由到另一个队列,即死信队列。可以监听这个死信队列中的消息以进行相应的处理。

如代码:

@Bean("normalQueue")
public Queue normalQueue() {
  return QueueBuilder.durable(Constant.NORMAL_QUEUE)
                     .deadLetterExchange(Constant.DLX_EXCHANGE_NAME)
                     .deadLetterRoutingKey("dlx").build();
}

制造产生死信队列的条件

如代码:

@Bean("normalQueue")
public Queue normalQueue() {
 return QueueBuilder.durable(Constant.NORMAL_QUEUE)
                    .deadLetterExchange(Constant.DLX_EXCHANGE_NAME)
                    .deadLetterRoutingKey("dlx")
                    .ttl(10*1000)  //消息过期时间
                    .maxLength(10L)  //队列的长度
                    .build();
}

发送消息

如代码:

@RequestMapping("/dlx")
 public void dlx() {
   //测试过期时间, 当时间达到TTL, 消息⾃动进⼊到死信队列 
   rabbitTemplate.convertAndSend(Constant.NORMAL_EXCHANGE_NAME, "normal", "dlx test...");
}

项目启动后,如图:

队列Features说明:

D:durable的缩写,设置持久化

TTL:Time to Live,队列设置了TTL

Lim:队列设置了长度(x-max-length)

DLX:队列设置了死信交换机(x-dead-letter-exchange)

DLK:队列设置了死信RoutingKey(x-dead-letter-routing-key)


发送后消息进入正常的队列。

如图:

10秒后,消息过期,消息进入死信队列。

如图:

当我们发送的消息,10条往上后,溢出的也会进入死信队列。


常见面试题


1. 死信队列的概念死信(Dead Letter)是消息队列中的⼀种特殊消息,它指的是那些无法被正常消费或处理的消息。在消息队列系统中,如RabbitMQ,死信队列用于存储这些死信消息。

2. 死信的来源:

(1)消息过期:消息在队列中存活的时间超过了设定的TTL。

(2)消息被拒绝:消费者在处理消息时,可能因为消息内容错误,处理逻辑异常等原因拒绝处理该消息。如果拒绝时指定不重新入队(requeue=false),消息也会成为死信。

(3)队列满了:当队列达到最大长度,无法再容纳新的消息时,新来的消息会被处理为死信。

3. 死信队列的应用场景对于RabbitMQ来说,死信队列是⼀个非常有用的特性。它可以处理异常情况下,消息不能够被消费者正确消费而被置入死信队列中的情况,应用程序可以通过消费这个死信队列中的内容来分析当时所遇到的异常情况,进而可以改善和优化系统。

比如:用户支付订单之后,支付系统会给订单系统返回当前订单的支付状态。

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

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

相关文章

30分钟学会正则表达式

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。 作用 匹配 查看一个字符串是否符合正则表达式的语法 搜索 正…

IDEA无法创建java8、11项目创建出的pom.xml为空

主要是由于Spring3.X版本不支持JDK8,JDK11,最低支持JDK17 解决的话要不就换成JDK17以上的版本,但是不太现实 另外可以参考以下方式解决 修改spring初始化服务器地址为阿里云的 https://start.aliyun.com/

Unity类银河战士恶魔城学习总结(P149 Screen Fade淡入淡出菜单)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/ 本章节实现了进入游戏和死亡之后的淡入淡出动画效果 UI_FadeScreen.cs 1. Animator 组件的引用 (anim) 该脚本通过 Animator 控制 UI 元…

IDEA 解决Python项目import导入报错、引用不到的问题

使用Idea 23.1 专业版编写Python项目时,import 导入爆红,无法引入其他package的代码,现象如: 解决方案:Idea表头打开 File -> Project Settring 解决效果:

[NSSRound#12 Basic]ordinary forensics

解压出来两个文件,一个是镜像文件另一个不知道 先查看镜像文件 vol.py -f /home/kali/Desktop/forensics.raw imageinfo再查看进程,发现有个cmd的程序 vol.py -f /home/kali/Desktop/forensics.raw --profileWin7SP1x64 pslist进行查看,有…

uniapp中父组件数组更新后与页面渲染数组不一致实战记录

简单描述一下业务场景方便理解: 商品设置功能,支持添加多组商品(点击添加按钮进行增加).可以对任意商品进行删除(点击减少按钮对选中的商品设置进行删除). 问题: 正常添加操作后,对已添加的任意商品删除后,控制台打印数组正常.但是与页面显示不一致.已上图为例,选中尾…

【Git系列】利用 Bash 脚本获取 Git 最后一次非合并提交的提交人

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

hadoop环境配置-vm安装+麒麟ubantu

一.VM版本 选择16版本,15版本存在windows蓝屏的情况,也不用设置HV等相关设置 激活下载参考下述博客:https://blog.csdn.net/matrixlzp/article/details/140674802 提前在bois打开SVM设置,不设置无法打开新建的虚拟机 ubantu下载…

基于SpringBoot的电脑配件销售系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

【linux学习指南】详解Linux进程信号保存

文章目录 📝保存信号🌠 信号其他相关常⻅概念🌉在内核中的表⽰ 🌠 sigset_t🌠信号集操作函数🌉sigprocmask🌉sigpending 🚩总结 📝保存信号 🌠 信号其他相关常…

[在线实验]-Redis Docker镜像的下载与部署

镜像下载 dockerredis镜像资源-CSDN文库 加载镜像 使用以下命令从redis.tar文件中加载Docker镜像 docker load --input redis.tar 创建映射目录 为了确保Redis的数据能够持久化,我们需要创建一个本地目录来存储这些数据 mkdir -p datasource/docker/redis 运…

嵌入式QT学习第4天:Qt 信号与槽

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 本章思维导图如下: 不使用 Qt Designer 的方式进行开发,用代码绘界面,可以锻炼我们的布局能力,和代码逻辑能力&#x…

【设计模式系列】解释器模式(十七)

一、什么是解释器模式 解释器模式(Interpreter Pattern)是一种行为型设计模式,它的核心思想是分离实现与解释执行。它用于定义语言的文法规则,并解释执行语言中的表达式。这种模式通常是将每个表达式抽象成一个类,并通…

在开发环境中,前端(手机端),后端(电脑端),那么应该如何设置iisExpress

首先,要想手机端应用能成功请求后端,两个设备至少需在同一个局域网内,且IP地址互通; 因为ajax是http(s)://IP地址端口号的方式请求,但是iisExpress默认是localhost如何解决,并没有IP地址,所以手…

行业分析---2024年蔚来汽车三季度财报及科技日

1 前言 在之前的博客中,笔者撰写了多篇行业类分析的文章(科技新能源): 《行业分析---我眼中的Apple Inc.》 《行业分析---马斯克的Tesla》 《行业分析---造车新势力之蔚来汽车》 《行业分析---造车新势力之小鹏汽车》 《行业分析-…

物联网射频识别和RFID开发(一):RFID基础—概念、应用

一、RFID的发展历史 二、RFID与物联网 (一)物联网与RFID的关系 物联网的基本思想是美国麻省理工学院在1999年提出的,其核心思想是为全球每个物品提供唯一的电子标识符。这种电子标识符就是现在经常提到的“电子产品编码(Electronic Product …

IPGuard与Ping32结合,提供企业级数据加密与防泄密解决方案,全面保障敏感数据安全

随着数字化转型的深入推进,企业面临着日益复杂的安全挑战。如何在确保数据流通的同时,保障企业的核心资产不被泄露,是每个企业必须面对的难题。为此,Ping32与IPGuard联合推出了一套全面的企业级数据加密与防泄密解决方案&#xff…

flink学习(8)——窗口函数

增量聚合函数 ——指窗口每进入一条数据就计算一次 例如:要计算数字之和,进去一个12 计算结果为20, 再进入一个7 ——结果为27 reduce aggregate(aggregateFunction) package com.bigdata.day04;public class _04_agg函数 {public static …

智能桥梁安全运行监测系统守护桥梁安全卫士

一、方案背景 桥梁作为交通基础设施中不可或缺的重要组成部分,其安全稳定的运行直接关联到广大人民群众的生命财产安全以及整个社会的稳定与和谐。桥梁不仅是连接两地的通道,更是经济发展和社会进步的重要纽带。为了确保桥梁的安全运行,桥梁安…

网络原理-初识

1.网络的发展历程 独立模式 独立模式:计算机之间相互独立。 每个终端A、B、C各自持有客户端数据 网络互连 随着时代的发展,越来越需要计算机之间互相通信,共享软件和数据,即可以多个计算机协调工作来完成业务,就有…