RabbitMQ---TTL与死信

(一)TTL

1.TTL概念

 TTL又叫过期时间

RabbitMQ可以对队列和消息设置TTL,当消息到达过期时间还没有被消费时就会自动删除

注:这里我们说的对队列设置TTL,是对队列上的消息设置TTL并不是对队列本身,不是说队列过期时间到了,队列被删除,而是消息到达此队列后会给他设定一个过期时间,这个时间到了,消息会删除,不是队列删除(如果同时此消息本身带有TTL过期时间,按短的来)

2.设置消息的TTL

  那我们说可以对队列和消息设置TTL

  那我们现在来先写对每条消息设置TTL(就是针对每一条消息设置消息的expiration参数,单位是毫秒)

那我们来看生产者代码(这里配置文件不需要去更改)

@RequestMapping("ttl")public String TTLPro(){String s1="ttl test";Message message=new Message(s1.getBytes(StandardCharsets.UTF_8));message.getMessageProperties().setExpiration("10000");RabbitTemplate.convertAndSend(Constants.TTL_EXCHANGE,"ttl",message);return "发送成功";}

  我们来看现象,我这里设置过期时间为10s,按理说到达队列后,如果10s钟还没有被消费掉,就会自动过期 

10s后 

 如果我们不设置TTL就表示消息不会过期,如果设置为0的化,就表示除非此时可以直接将消息给消费者,否者就会被丢弃

 3.设置队列的TTL

  设置队列的TTL是比较简单的,但是注意,我们队列如果存在的话,我们是不可以直接改代码,然后更改队列的配置信息的,同时交换机也是这样,如果我们想改,可以再声明个队列,或者把队列先删了再创建(此时队列上的消息会丢失)

设置队列过期时间,只需要在队列上配置ttl属性就可以,我这里设置了5s

此时我们队列的特性就又多了个TTL 

 然后我们继续向接口发送消息

5s后就变成了(真的是5s 骗人是g)

4.两者区别 

 设置队列TTL属性的方法,一旦消息过期,就会立即从队列中删除

 设置消息TTL的方法,一旦消息过期(且不是队列中第一个消息),消息并不会立即删除,而是在要发送给消费者之前进行判定,如果过期了再删

 那我们就有疑问了,这是为什么呢?   本质上,是为了提高性能,因为设置队列的过期时间,他们消息的最长存在时间就是队列的过期时间,所有消息的存在时间都小于等于队列过期时间,所以此时队列中已过期的元素大部分都在队列头部,RabbitMQ只需要定期从队头开始扫描是否有过期消息即可

  而设置消息TTL,每条消息的过期时间都不同,如果想要删除所有过期时间,就需要扫描整个队列,很影响性能,所以不如等到用到了此消息,再判定是否过期,如果过期了再删除

(二)死信

1.死信概念

 死信就是因为一些原因(包括消息过期,消息被拒绝接收,队列达到最大长度)无法被消费的消息。

 那既然有这些无法被处理的信息,那一定就有存储他们的队列,有队列就要有交换机,那么这个队列就叫做死信队列(DLQ),这个交换机就叫死信交换机(DLX)

 本质上与正常的交换机和队列没什么区别

消息变成死信后,会被发送到死信交换机,然后由死信交换机绑定到死信队列中

2.代码演示

首先我们要声明一个死信队列和死信交换机进行绑定,哪至于正常的队列,我们就用刚刚的TTL为5的队列吧

   @Bean("ttlExchange")public Exchange ttlExchange(){return ExchangeBuilder.directExchange(Constants.TTL_EXCHANGE).durable(true).build();}@Bean("ttlQueue")public Queue ttlQueue(){return QueueBuilder.durable(Constants.TTL_QUEUE).ttl(5000).deadLetterExchange(Constants.DEAD_EXCHANGE).deadLetterRoutingKey("dead").build();}@Bean("ttlBind")public Binding ttlBind(@Qualifier("ttlExchange") Exchange ackExchange,@Qualifier("ttlQueue") Queue queue){return BindingBuilder.bind(queue).to(ackExchange).with("ttl").noargs();}@Bean("deadExchange")public Exchange deadExchange(){return ExchangeBuilder.directExchange(Constants.DEAD_EXCHANGE).durable(true).build();}@Bean("deadQueue")public Queue deadQueue(){return QueueBuilder.durable(Constants.DEAD_QUEUE).build();}@Bean("deadBind")public Binding deadBind(@Qualifier("deadExchange") Exchange ackExchange,@Qualifier("deadQueue") Queue queue){return BindingBuilder.bind(queue).to(ackExchange).with("dead").noargs();}

然后我们发送消息等待5s看一下

 

然后我们看看刚才绑定死信交换机的那个队列特征 

我们发现又多了两个特征

那验证完TTL过后,我们来看消息被拒绝的情况

首先我们要把消息确认模式改成手动确认,然后拒绝接收消息

 @RabbitListener(queues = Constants.TTL_QUEUE)public void ListenerQueue2(Message message,Channel channel) throws IOException {long Tag=message.getMessageProperties().getDeliveryTag();try {System.out.println("接收到消息: "+ new String(message.getBody())+" TagID: "+Tag);int num=3/0;     //模拟失败channel.basicAck(Tag,false);System.out.println("处理完成");}catch (Exception e){channel.basicReject(Tag,false);}}

然后我们调用接口,看死信队列,我们发现确实多了一条死信消息 

 

那第三种产生死信的消息是,队列满了,那我们就需要更改一下我们队列 

@Bean("ttlQueue")public Queue ttlQueue(){return QueueBuilder.durable(Constants.TTL_QUEUE).ttl(5000).deadLetterExchange(Constants.DEAD_EXCHANGE).deadLetterRoutingKey("dead").maxLength(5l).build();}

 

此时我们注意我们要的是long类型,如果传错了会给我们报错的

那我们再来看这个队列

 我们发现又多了一个特征

我们到此已经给队列设置5个特征了,我们来分别看一下

1)D:设置队列为持久化的

2)TTL:设置队列的过期时间

3)Lim:设置队列的最大长度

4)DLX:设置了死信交换机

5)DLK:设置了死信RoutingKey

3.死信面试题

死信概念,死信来源,死信场景

前两个我们都说过了,这里主要说一下死信的应用场景

比如我们用户支付订单,支付系统会给我们订单系统返回当前订单的支付状态

 为了保障支付信息不丢失,需要使用死信队列机制,当消息消费异常时,会放到死信队列中(有可能存在用户支付,但是消息没有被消费或者异常拒绝的情况),此时我们放到死信队列中,再对这个数据进行处理(可能是人工确认)

还有一些应用场景包括:

消息丢弃,直接丢弃这些无法处理的消息,避免他们占用系统资源

日志收集:将死信消息作为日志收集,用于后续分析和定位

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

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

相关文章

先进制造aps专题二十七 西门子opcenter aps架构分析

欧美的商业aps,主要就是sap apo,西门子opcenter aps,达索quintiq 从技术的层面,西门子aps是不如sap apo的,但是西门子aps是西门子数字化工厂产品的核心,有很多特色,所以分析 西门子aps主要分计划器和排产器两个部分 计…

WPF如何跨线程更新界面

WPF如何跨线程更新界面 在WPF中,类似于WinForms,UI控件只能在UI线程(即主线程)上进行更新。WPF通过Dispatcher机制提供了跨线程更新UI的方式。由于WPF的界面基于Dispatcher线程模型,当你在非UI线程(例如后…

ingress-nginx代理tcp使其能外部访问mysql

一、helm部署mysql主从复制 helm repo add bitnami https://charts.bitnami.com/bitnami helm repo updatehelm pull bitnami/mysql 解压后编辑values.yaml文件,修改如下(storageclass已设置默认类) 117 ## param architecture MySQL archit…

macOS Sequoia 15.3 beta3(24D5055b)发布,附黑、白苹果镜像下载地址

“ 镜像(黑苹果引导镜像、白苹果Mac镜像、黑苹果虚拟机镜像)下载地址:黑果魏叔官网。” 关于macOS Sequoia 15.3 beta3(24D5055b),以下是对其的详细介绍: 一、版本发布信息 发布时间 &#xf…

豪越科技消防一体化安全管控平台:推动消防作训模式智慧转型

在当今数字化浪潮席卷全球的时代背景下,各行业都在积极寻求创新与变革,以提升工作效率、优化管理流程。消防行业作为保障社会安全的关键领域,其数字化转型的需求尤为迫切。豪越科技的消防一体化安全管控平台应运而生,为消防工作带…

Tomcat下载配置

目录 Win下载安装 Mac下载安装配置 Win 下载 直接从官网下载https://tomcat.apache.org/download-10.cgi 在圈住的位置点击下载自己想要的版本 根据自己电脑下载64位或32位zip版本 安装 Tomcat是绿色版,直接解压到自己想放的位置即可 Mac 下载 官网 https://tomcat.ap…

1161 Merging Linked Lists (25)

Given two singly linked lists L1​a1​→a2​→⋯→an−1​→an​ and L2​b1​→b2​→⋯→bm−1​→bm​. If n≥2m, you are supposed to reverse and merge the shorter one into the longer one to obtain a list like a1​→a2​→bm​→a3​→a4​→bm−1​⋯. For ex…

【记录】腾讯混元大模型本地部署过程

概述 本文记录在本地部署腾讯混元大模型的过程。仅为部署记录,不涉及过多的技术要点。 混元大模型主页:https://github.com/Tencent/HunyuanVideo 该模型应该是当前开源的效果不错的模型,其实官方文档将部署过程写的相当详细了,但是这里为了便于后期的学习,特意将部署过程…

Go-知识 版本演进

Go-知识 版本演进 Go release notesr56(2011/03/16)r57(2011/05/03)Gofix 工具语言包工具小修订 r58(2011/06/29)语言包工具小修订 r59(2011/08/01)语言包工具 r60(2011/09/07)语言包工具 [go1 2012-03-28](https://golang.google.cn/doc/devel/release#go1)[go1.1 2013-05-13]…

Java锁 死锁及排查 JVM 工具 jconsole 工具 排查死锁

目录 概述 死锁案例 (面试) 如何排查死锁 使用 JVM 工具排查死锁 使用 jconsole 工具排查死锁 细节 概述 死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力于涉那它们都将无法推进下去,如果系统资源充足,…

计算机网络 (49)网络安全问题概述

前言 计算机网络安全问题是一个复杂且多维的领域,它涉及到网络系统的硬件、软件以及数据的安全保护,确保这些元素不因偶然的或恶意的原因而遭到破坏、更改或泄露。 一、计算机网络安全的定义 计算机网络安全是指利用网络管理控制和技术措施,保…

CSS 合法颜色值

CSS 颜色 CSS 中的颜色可以通过以下方法指定: 十六进制颜色带透明度的十六进制颜色RGB 颜色RGBA 颜色HSL 颜色HSLA 颜色预定义/跨浏览器的颜色名称使用 currentcolor 关键字 十六进制颜色 用 #RRGGBB 规定十六进制颜色,其中 RR(红色&…

C# 实现系统信息监控与获取全解析

在 C# 开发的众多应用场景中,获取系统信息以及监控用户操作有着广泛的用途。比如在系统性能优化工具中,需要实时读取 CPU、GPU 资源信息;在一些特殊的输入记录程序里,可能会涉及到键盘监控;而在图形界面开发中&#xf…

使用docker-compose安装ELK(elasticsearch,logstash,kibana)并简单使用

首先服务器上需要安装docker已经docker-compose,如果没有,可以参考我之前写的文章进行安装。 https://blog.csdn.net/a_lllk/article/details/143382884?spm1001.2014.3001.5502 1.下载并启动elk容器 先创建一个网关,让所有的容器共用此网…

二十四、NetworkPolicy

NetworkPolicy 一、基础网路 Kubernetes网络模型设计的一个基础原则是:每个Pod都拥有一个独立的IP地址,并假定所有Pod都在一个可以直接连通的、扁平的网络空间中。所以不管它们是否运行在同一个Node(宿主机)中,都要求它们可以直接通过对方的IP进行访问。设计这个原则的原…

Python Web应用开发入门:从零搭建一个简单的Web应用

引言 在当今的互联网时代,Web应用已经成为我们日常生活中不可或缺的一部分。无论是社交媒体、电子商务,还是在线教育,Web应用都在背后发挥着重要作用。Python作为一种简洁、强大的编程语言,在Web开发领域也有着广泛的应用。本文将带你从零开始,使用Python搭建一个简单的W…

Java操作Excel导入导出——POI、Hutool、EasyExcel

目录 一、POI导入导出 1.数据库导出为Excel文件 2.将Excel文件导入到数据库中 二、Hutool导入导出 1.数据库导出为Excel文件——属性名是列名 2.数据库导出为Excel文件——列名起别名 3.从Excel文件导入数据到数据库——属性名是列名 4.从Excel文件导入数据到数据库…

下载文件,浏览器阻止不安全下载

背景: 在项目开发中,遇到需要下载文件的情况,文件类型可能是图片、excell表、pdf、zip等文件类型,但浏览器会阻止不安全的下载链接。 效果展示: 下载文件的两种方式: 一、根据接口的相对url,拼…

第15章:Python TDD应对货币类开发变化(二)

写在前面 这本书是我们老板推荐过的,我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后,我突然思考,对于测试开发工程师来说,什么才更有价值呢?如何让 AI 工具更好地辅助自己写代码,或许…

CSS 动画相关属性

定义和用法 一些 CSS 属性可用于动画制作,这意味着它们可用于过渡等效果中。 可设置动画的属性可以从一个值逐渐更改为另一个值,例如尺寸、数字、百分比和颜色。 浏览器支持 表格中的数字注明了完全支持 CSS 动画的首个浏览器版本。 -webkit-、-moz…