RabbitMQ 高级特性之死信队列

1. 简介

在前面的高级特性中,我们介绍了重试机制和 TTL,那么产生下列问题:

  • 在重试机制中,当消费者消费消息发生异常时,会触发消息重发机制,由于我们配置了最大的重发次数,那么当超过这个次数后,若消息依然没有被成功消费,就需要将消息进行保存,等待下一次消费,那么,这条消息应该保存到哪里去呢?
  • 在 TTL 机制中,我们为队列和消息设置了过期时间,当超过这个时间后消息就会被删除,但是这条消息是需要被消费的,于是就需要将过期的消息保存下来,等待下次消费。但是,消息应该保存到哪里去呢?

在 RabbitMQ 中,将类似于结果的消息称为死信,那么就涉及到,变成死信的消息应该存储到哪里去?

2. 会产生死信的场景

  • 消息重发后,次数到达指定重发次数依然未被消费,就会成为死信
  • 消息到达过期时间依然没有被消费,就会成为死信
  • 队列已经满了,却依然由消息入队列,就会产生溢出,溢出的这部分消息就会成为死信

3. 死信队列

在 RabbitMQ 中,可以声明一个队列,这个队列专门用来存放死信,于是就成为死信队列。

死信队列的工作流程如下:

  1. 首先需要声明一个死信交换机,与普通队列进行绑定;
  2. 其次需要声明一个死信队列,与死信交换机进行绑定;
  3. 当普通队列中的消息成为死信后,就会被发送给死信交换机,然后由死信交换机分配给与之绑定的死信队列;
  4. 存储在死信队列中的死信会等待被别的消费者再次消费。

4. 配置死信交换机与死信队列

声明一个正常交换机,正常队列,死信交换机,死信队列,并将正常交换机与正常队列进行绑定,将正常队列与死信交换机进行绑定,将死信交换机与死信队列进行绑定,代码如下:

@Configuration
public class DLConfig {/*** 正常* @return*/@Bean("norQueue")public Queue norQueue() {return QueueBuilder.durable(Constants.NOR_QUEUE).ttl(10000) //过期时间 10s.deadLetterExchange(Constants.DL_EXCHANGE) //绑定死信交换机.deadLetterRoutingKey(Constants.DL_ROUTINGKEY).maxLength(10L) //队列长度为 10.build();}@Bean("norExchange")public DirectExchange norExchange() {return ExchangeBuilder.directExchange(Constants.NOR_EXCHANGE).build();}@Bean("norBind")public Binding norBind(@Qualifier("norExchange") DirectExchange directExchange,@Qualifier("norQueue") Queue queue) {return BindingBuilder.bind(queue).to(directExchange).with(Constants.NOR_ROUTINGKEY);}/*** 死信*/@Bean("dlQueue")public Queue dlQueue() {return QueueBuilder.durable(Constants.DL_QUEUE).build();}@Bean("dlExchange")public DirectExchange dlExchange() {return ExchangeBuilder.directExchange(Constants.DL_EXCHANGE).build();}@Bean("dlBind")public Binding dlBind(@Qualifier("dlExchange") DirectExchange directExchange,@Qualifier("dlQueue") Queue queue) {return BindingBuilder.bind(queue).to(directExchange).with(Constants.DL_ROUTINGKEY);}
}

在上面的代码中,我们指定了下面的条件:

  • 队列的过期时间为 10s
  • 队列长度为 10 

重试机制的配置如下:

spring:rabbitmq:listener:simple:acknowledge-mode: autoretry:enabled: true # 开启消费者失败重试initial-interval: 5000ms # 初始失败等待时⻓为5秒max-attempts: 5 # 最⼤重试次数(包括自身消费的⼀次)

在上面的配置中,设置的最大的重发次数为 5 次。

5. 验证消息重试超过规定次数是否进入死信队列

生产者代码如下:

    @RequestMapping("/dl")public String dl() {String messageInfo = "dl... ";rabbitTemplate.convertAndSend(Constants.NOR_EXCHANGE, Constants.NOR_ROUTINGKEY, messageInfo);return "消息发送成功";}

消费者代码如下:

@Component
@Slf4j
public class DLListener {@RabbitListener(queues = Constants.NOR_QUEUE)public void listener(Message message) throws IOException {String messageInfo = new String(message.getBody());long deliveryTag = message.getMessageProperties().getDeliveryTag();log.info("接收消息, message: {}, deliveryTag: {}", messageInfo, deliveryTag);int num = 1 / 0;log.info("消息消费完成");}
}

代码运行结果如下:

 

消息重发五次后抛出异常,观察 RabbitMQ 客户端后,这条消息已经存放进了死信队列中:

  

6. 验证 TTL 与死信队列

生产者代码如下:

    @RequestMapping("/dl")public String dl() {String messageInfo = "dl... ";rabbitTemplate.convertAndSend(Constants.NOR_EXCHANGE, Constants.NOR_ROUTINGKEY, messageInfo);return "消息发送成功";}

将正常队列的 TTL 设置为 10s,运行代码后,观察 RabbitMQ 客户端:

10s 前:

10s 后:

 

7. 验证队列溢出与死信队列

将正常队列的长度设置为 10,生产者向 RabbitMQ 发送 20 条数据,生产者代码如下:

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

运行代码,观察 RabbitMQ 客户端:

可以看到,溢出的 10 条消息进入了死信队列。 

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

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

相关文章

如何选择合适的工业相机快门种类

在工业相机领域&#xff0c;常见的三种快门类型&#xff1a;全局快门&#xff08;Global Shutter&#xff09;、卷帘快门&#xff08;Rolling Shutter&#xff09;以及全局复位式卷帘快门&#xff08;Global - reset rolling Shutter&#xff09;。我们主要来讲讲全局快门&…

uloop源码剖析

uloop是libubox库的核心模块&#xff0c;libubox是OpenWrt基础库之一&#xff0c;用来提供事件驱动、基础数据结构等。 uloop支持文件描述符监控、超时定时器、子进程管理、信号处理事件、间隔定时器等五大核心功能。 主体框架 uloop循环的主体框架有三个函数构成&#xff0c…

Mac电脑 虚拟机 VMware Fusion13

VMware Fusion mac 不仅能让你在Mac苹果电脑上运行Windows或Linux系统、使用非Mac平台的应用&#xff0c;而且还可以支持各种USB硬件设备。 原文地址&#xff1a;VMware Fusion 13 Mac虚拟机

嵌套容器是隐射宿主机的路径而不是容器的路径

嵌套容器是隐射宿主机的路径而不是容器的路径 为什么&#xff1f;容器中的 Docker 运行流程 为什么&#xff1f; 这个问题涉及 Docker 的工作原理&#xff0c;特别是嵌套容器的行为。让我们逐步分析为什么在容器内部启动其他容器时&#xff0c;文件系统的挂载行为是基于 宿主机…

Go语言--语法基础6--基本数据类型--切片类型

Go 语言切片是对数组的抽象。Go 数组的长度不可改变&#xff0c;在特定场景中这样的集合就不太适用&#xff0c;Go 中提供了一种灵活、功能强悍的内置类型切片 ("动态数组")&#xff0c;与数组相比切片的长度是不固定的&#xff0c;可以追加元素&#xff0c;在追加时…

​御控物联网综合应用实训平台-物联网系统和实验室实训系统​

在科技飞速发展的今天&#xff0c;物联网技术已渗透到各个领域&#xff0c;成为推动产业升级和创新发展的重要力量。对于职业教育和科研机构而言&#xff0c;搭建一套完善的物联网综合应用实训系统&#xff0c;培养适应时代需求的物联网专业人才&#xff0c;显得尤为迫切。而御…

ElasticSearch中的分片是什么?

大家好&#xff0c;我是锋哥。今天分享关于【ElasticSearch中的分片是什么?】面试题。希望对大家有帮助&#xff1b; ElasticSearch中的分片是什么? 超硬核AI学习资料&#xff0c;现在永久免费了&#xff01; 在 Elasticsearch 中&#xff0c;分片&#xff08;Shard&#x…

基于PHP+MySQL组合开发开源问答网站平台源码系统 源码开源可二次开发 含完整的搭建指南

问答网站成为人们获取知识、交流经验的重要平台。无论是专业领域的疑难解答&#xff0c;还是生活常识的分享探讨&#xff0c;问答网站都发挥着巨大的作用。对于想要搭建问答网站的个人或企业来说&#xff0c;一款优秀的开源问答网站平台源码系统至关重要。今天&#xff0c;我们…

Python工程师面试题集

文章目录一、Python基础二、关键Python库三、Web开发四、并发与性能五、系统设计答案区一、Python基础Python的可变与不可变数据类型有哪些&#xff1f;底层实现原理&#xff1f;Python2与Python3的主要区别解释GIL全局解释器锁及其对多线程的影响装饰器Decorator的作用与实现原…

什么是码率?剪映中如何选择适合的视频码率

在视频编辑过程中&#xff0c;码率&#xff08;Bitrate&#xff09;是一个决定视频画质的关键参数。对于普通用户来说&#xff0c;剪映作为一款功能强大的视频编辑工具&#xff0c;其默认的码率设置直接影响最终导出视频的质量和文件大小。那么&#xff0c;剪映的默认码率是多少…

专题:2025电商营销与AI应用发展趋势报告|附260+份报告PDF、原数据表汇总下载

原文链接&#xff1a;https://tecdat.cn/?p42834 电商行业在数字经济浪潮中持续演进&#xff0c;2025年呈现出多平台发力、技术驱动增长、消费需求多元等特点。快手和抖音作为国内直播电商的重要阵地&#xff0c;各品类销售表现各有亮点&#xff0c;同时全球电商市场规模稳步…

windows安装stable diffusion

安装git https://git-scm.com/downloads/winclone项目 创建一个文件夹&#xff0c;clone下来stable diffusion webui git网址&#xff1a;https://github.com/AUTOMATIC1111/stable-diffusion-webui git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git安装…

Python爬虫 XPath 三方库lxml

前言 XPath是Python爬虫最重要的过滤原始数据的手段之一,是爬虫最核心的技术 是专业抓取HTML页面而生的,基本上只用于抓取HTML页面使用 目录 安装支持XPath三方库lxml XPath代码入门示例 XPath表达式语法 在源代码上面直接获取XPath 安装支持XPath三方库lxml pip instal…

深度学习洪水推演:Python融合多源卫星数据可视化南方暴雨灾情

目录1. 引言&#xff1a;多源卫星融合分析的突破性价值2. 多模态融合架构设计3. 双流程对比分析3.1 单源 vs 多源融合分析3.2 洪水推演核心流程4. 核心代码实现4.1 多源数据融合处理&#xff08;Python&#xff09;4.2 时空洪水推演模型&#xff08;PyTorch&#xff09;4.3 三维…

「日拱一码」016 深度学习常用库——PyTorch

目录 张量操作 创建张量&#xff1a; torch.tensor() &#xff1a;直接从数据创建张量 torch.zeros() &#xff1a;创建全零张量 torch.ones() &#xff1a;创建全一张量 torch.randn() &#xff1a;创建正态分布随机张量 torch.arange() &#xff1a;创建等差序列张量 …

【Qt】QStringLiteral 介绍

QStringLiteral 介绍 QStringLiteral 是 Qt 框架中提供的一个宏&#xff0c;用于在编译时从字符串字面量创建 QString 对象&#xff0c;具有高效和零内存分配的特点。 主要特点 编译时转换&#xff1a;将字符串字面量在编译时转换为 QString 数据&#xff0c;而不是运行时。…

UI前端与数字孪生结合实践探索:智慧物流的货物追踪与配送优化

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩!一、引言&#xff1a;数字孪生重构智慧物流的技术范式在物流行业数字化转型的浪潮中&#xff0…

Java创建型模式---工厂模式

工厂模式基础概念 工厂模式是一种创建型设计模式&#xff0c;其核心思想是将对象的创建和使用分离。通过使用工厂模式&#xff0c;可以将对象创建逻辑集中管理&#xff0c;提高代码的可维护性和可扩展性。在 Java 中&#xff0c;工厂模式主要分为三种类型&#xff1a; 简单工…

分布式定时任务:xxl-job

基础 XXL - Job采用的是调度中心&#xff08;Scheduler&#xff09;与执行器&#xff08;Executor&#xff09;分离的架构设计&#xff0c;这种设计带来了诸多优势&#xff0c;比如高可用性、可扩展性以及便于分布式部署等。 1. 调度中心&#xff08;XXL - Job Admin&#xf…

易语言实现钉钉PC端高频率链接批量打开系统

易语言实现钉钉PC端高频率链接批量打开系统 一、需求分析与技术方案 核心需求: 在钉钉PC端私聊消息中嵌入特殊格式链接用户点击后通过自定义协议唤醒本地程序支持每分钟处理10万次请求的批量操作实现链接的批量生成和管理技术方案: #mermaid-svg-AYoMWYQQf71dlyEF {font-fa…