RabbitMQ详解(五):过期时间TTL、死信队列、磁盘监控

news2024/9/20 22:43:49

过期时间TTL(Time To Live)

过期时间TTL表示可以对消息设置预期的时间,在这个时间内都可以被消费者接收获取;过了之后消息将自动被删除。

目前有两种方法可以设置

  • 第一种方法是通过队列属性设置,队列中所有消息都有相同的TTL。
  • 第二种方法是对消息进行单独设置,每条消息TTL可以不同。

当同时指定了 queue 和 message 的 TTL 值,则两者中较小的那个才会起作用。

设置队列TTL

  • 过期时间参数(x-message-ttl 为固定值)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DF9J9qqP-1683772739811)(RabbitMQ.assets/image-20230511093929117.png)]

  • 在springboot_rabbitmq_producer 代码的基础上新增以下配置文件

    参数 x-message-ttl 的值 必须是非负 32 位整数 (0 <= n <= 2^32-1) ,以毫秒为单位表示 TTL 的值。这样,值 5000 表示存在于 队列 中的当前 消息 将最多只存活 5 秒钟。

    package com.cn.config;
    
    import org.springframework.amqp.core.Binding;
    import org.springframework.amqp.core.BindingBuilder;
    import org.springframework.amqp.core.DirectExchange;
    import org.springframework.amqp.core.Queue;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import java.util.HashMap;
    
    @Configuration
    public class TTLDirectRabbitmqConfig {
    
        //1.声明交换机
        @Bean
        public DirectExchange ttldirectExchange(){
         return new DirectExchange("ttl-direct-exchange", true, false);
        }
    
        //2.声明队列
        @Bean
        public Queue directTTLQueue(){
            //设置过期时间,以毫秒为单位
            HashMap<String, Object> map = new HashMap<>();
            map.put("x-message-ttl", 5000);
            return new Queue("ttl.direct.queue", true, false, false, map);
        }
    
        //3.交换机和队列进行绑定
        @Bean
        public Binding directTTLBinding(){
            return BindingBuilder.bind(directTTLQueue()).to(ttldirectExchange()).with("ttl");
        }
    }
    
  • 生产者代码中新增以下方法

       public void createOrderDirectTTL(String useerId, String productId, int num){
            String orderId = UUID.randomUUID().toString();
            String exchangeName  = "ttl-direct-exchange";
            String routeKey  = "ttl";
            rabbitTemplate.convertAndSend(exchangeName, routeKey, orderId);
        }
    
  • 测试类

     @Test
        void testOrderDirectTTL() {
            orderService.createOrderDirectTTL("1","1",555);
        }
    
  • 启动测试,查看图形化管理界面,会看到队列上有DDL标识

    在这里插入图片描述

    静等5秒之后会看到消息自动消失

    在这里插入图片描述

设置消息TTL

  • 在上面代码的基础上修改

     @Bean
        public Queue directTTLQueue2(){
            return new Queue("ttl2.direct.queue", true);
        }
    
       @Bean
        public Binding directTTL2Binding(){
            return BindingBuilder.bind(directTTLQueue2()).to(ttldirectExchange()).with("ttl2");
        }
    
  • 生产者代码

    public void createOrderDirectTTL2(String useerId, String productId, int num){
            String orderId = UUID.randomUUID().toString();
            String exchangeName  = "ttl-direct-exchange";
            String routeKey  = "ttl2";
            // 对消息设置过期时间
            MessagePostProcessor messagePostProcessor = new MessagePostProcessor() {
                @Override
                public Message postProcessMessage(Message message) throws AmqpException {
                    message.getMessageProperties().setExpiration("5000");
                    return message;
                }
            };
            rabbitTemplate.convertAndSend(exchangeName, routeKey, orderId, messagePostProcessor);
        }
    

    expiration 字段以微秒为单位表示 TTL 值。且与 x-message-ttl 具有相同的约束条件。因为 expiration 字段必须为字符串类型,broker 将只会接受以字符串形式表达的数字。

  • 测试代码

     @Test
        void testOrderDirectTTL2() {
            orderService.createOrderDirectTTL2("1","1",666);
        }
    
  • 启动测试,查看图形化管理界面,会看到队列上没有DDL标识,但是我们静等5秒钟后,队列中的消息也会自动消失

    在这里插入图片描述

    在这里插入图片描述

死信队列

DLX,全称为Dead-Letter-Exchange , 可以称之为死信交换机,也有人称之为死信邮箱。

当消息在一个队列中变成死信(dead message)之后,它能被重新发送到另一个交换机中,这个交换机就是DLX ,绑定DLX的队列就称之为死信队列。

消息变成死信,可能是由于以下的原因:

  • 消息被拒绝
  • 消息过期
  • 队列达到最大长度

DLX也是一个正常的交换机,和一般的交换机没有区别,它能在任何的队列上被指定,实际上就是设置某一个队列的属性。当这个队列中存在死信时,Rabbitmq就会自动地将这个消息重新发布到设置的DLX上去,进而被路由到另一个队列,即死信队列。
要想使用死信队列,只需要在定义队列的时候设置队列参数 x-dead-letter-exchange 指定交换机即可。

  • 添加死信队列和交换机绑定关系

    package com.cn.config;
    
    import org.springframework.amqp.core.Binding;
    import org.springframework.amqp.core.BindingBuilder;
    import org.springframework.amqp.core.DirectExchange;
    import org.springframework.amqp.core.Queue;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    /**
     * 死信队列
     */
    @Configuration
    public class DeadDirectRabbitmqConfig {
    
        //1.声明交换机
        @Bean
        public DirectExchange deadDirectExchange(){
         return new DirectExchange("dead-direct-exchange", true, false);
        }
    
        //2.声明队列
        @Bean
        public Queue directDeadQueue(){
            return new Queue("dead.direct.queue", true);
        }
    
        //3.交换机和队列进行绑定
        @Bean
        public Binding directDeadBinding(){
            return BindingBuilder.bind(directDeadQueue()).to(deadDirectExchange()).with("dead");
        }
    }
    
  • 修改TTLDirectRabbitmqConfig配置

      //2.声明队列
        @Bean
        public Queue directTTLQueue(){
            //设置过期时间
            HashMap<String, Object> map = new HashMap<>();
            map.put("x-message-ttl", 5000); //过期时间
            map.put("x-dead-letter-exchange", "dead-direct-exchange"); //死信队列
            map.put("x-dead-letter-routing-key", "dead"); // direct模式需要配置routing-key
            return new Queue("ttl.direct.queue", true, false, false, map);
        }
    
  • 启动测试(需要先删除ttl.direct.queue)

    在这里插入图片描述

  • 过期后就会被投递到之前配置的死信队列中

    在这里插入图片描述

内存磁盘的监控

内存警告

当内存使用超过配置的阈值或者磁盘空间剩余空间对于配置的阈值时,RabbitMQ会暂时阻塞客户端的连接,并且停止接收从客户端发来的消息,以此避免服务器的崩溃,客户端与服务端的心态检测机制也会失效。

内存的最大极限为0.4 假设电脑是4G,那么内存的最大阈值就是1.6G

内存控制

参考帮助文档:https://www.rabbitmq.com/configure.html 当出现警告的时候,可以通过配置去修改和调整

  • 命令

    //命令设置比例
    rabbitmqctl set_vm_memory_high_watermark <fraction>
    //命令设置大小
    rabbitmqctl set_vm_memory_high_watermark absolute 50MB
    

    ​ fraction/value 为内存阈值。默认情况是:0.4/2GB,代表的含义是:当RabbitMQ的内存超过40%时,就会产生警告并且阻塞所有生产者的连接。通过此命令修改阈值在Broker重启以后将会失效,通过修改配置文件方式设置的阈值则不会随着重启而消失,但修改了配置文件一样要重启broker才会生效。

  • 测试案例

    [root@hecs-66166 ~]# rabbitmqctl set_vm_memory_high_watermark absolute 50MB
    Setting memory threshold on rabbit@hecs-66166 to 50MB bytes ...
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6kMpR8W7-1683772739814)(RabbitMQ.assets/image-20230511103209093.png)]

    [root@hecs-66166 ~]# rabbitmqctl set_vm_memory_high_watermark 0.4
    Setting memory threshold on rabbit@hecs-66166 to 0.4 ...
    

    在这里插入图片描述

内存换页

在某个Broker节点及内存阻塞生产者之前,它会尝试将队列中的消息换页到磁盘以释放内存空间,持久化和非持久化的消息都会写入磁盘中,其中持久化的消息本身就在磁盘中有一个副本,所以在转移的过程中持久化的消息会先从内存中清除掉。

默认情况下,内存到达的阈值是50%时就会换页处理。

也就是说,在默认情况下该内存的阈值是0.4的情况下,当内存超过0.4*0.5=0.2时,会进行换页动作。

比如有1000MB内存,当内存的使用率达到了400MB,已经达到了极限,但是因为配置的换页内存0.5,这个时候会在达到极限400mb之前,会把内存中的200MB进行转移到磁盘中。从而达到稳健的运行。

  • 可以通过设置 vm_memory_high_watermark_paging_ratio 来进行调整

    vm_memory_high_watermark.relative = 0.4vm_memory_high_watermark_paging_ratio = 0.7(设置小于1的值)
    

为什么设置小于1,以为你如果你设置为1的阈值。内存都已经达到了极限了。你在去换页意义不是很大了。

磁盘预警

当磁盘的剩余空间低于确定的阈值时,RabbitMQ同样会阻塞生产者,这样可以避免因非持久化的消息持续换页而耗尽磁盘空间导致服务器崩溃。

默认情况下:磁盘预警为50MB的时候会进行预警。表示当前磁盘空间第50MB的时候会阻塞生产者并且停止内存消息换页到磁盘的过程。
这个阈值可以减小,但是不能完全的消除因磁盘耗尽而导致崩溃的可能性。比如在两次磁盘空间的检查空隙内,第一次检查是:60MB ,第二检查可能就是1MB,就会出现警告。

  • 命令

    rabbitmqctl set_disk_free_limit  <disk_limit>
    rabbitmqctl set_disk_free_limit memory_limit  <fraction>
    
    disk_limit:固定单位 KB MB GB
    fraction :是相对阈值,建议范围在:1.0~2.0之间。(相对于内存)
    
  • 测试案例

    [root@hecs-66166 ~]# rabbitmqctl set_disk_free_limit 40GB
    Setting disk free limit on rabbit@hecs-66166 to 40GB bytes ...
    

    在这里插入图片描述

    [root@hecs-66166 ~]# rabbitmqctl set_disk_free_limit 50MB
    Setting disk free limit on rabbit@hecs-66166 to 50MB bytes ...
    

    在这里插入图片描述

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

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

相关文章

App报毒-Google Play保护机制,已屏蔽不安全的应用

一、概述 解决安卓app在海外国际版本如&#xff1a;华为、OPP/VIVO、小米和荣耀报毒问题.触发Google Play保护机制. 安卓app报毒爆红&#xff0c;vivo手机爆红&#xff0c;oppo小米华为荣耀手机报毒&#xff0c;手机安装app时提示报毒&#xff0c;有的app是刚打包出来、有的是用…

Cocos Creator 3.7.3 正式上线,渲染管线和算法持续更新

Cocos Creator 3.7.3 正式发布。该版本对近日用户反馈的一系列关键性问题进行了集中修复&#xff0c;也对一部分性能进行了优化&#xff0c;提升了用户体验&#xff0c;建议所有 v3.x 用户升级。 Engine Features Render Graph 自定义渲染管线支持 GLES 后端Deprecate addRast…

【C++】五一假期,我学会了C++类和对象 ( 看完这篇你也能学会 ~ )

文章目录 ☑️前言✅类和对象【&#x1f3c6;上篇&#x1f3c6;】一. 面向过程和面向对象初步认识二. 与类的完美邂逅❤️1. 类的引入2. 类的定义 三. 增进与类的距离❤️1. 类的访问限定符及封装1.1. 访问限定符1.2. 封装【⭐重大思想⭐】 2. 类的作用域3. 类的实例化 四. 类对…

专访惠众科技|元宇宙应用如何借助3DCAT实时云渲染实现流畅大并发呈现?

当前互联网流量红利已经逐渐消失&#xff0c;营销同质化愈发严重。在这样的背景下&#xff0c;催生了以为元宇宙 焦点的虚拟产业经济。元宇宙在各行各业中以不同形式快速萌生、成长&#xff0c;呈现出多元化的应用场景。尤其是众多品牌&#xff0c;将元宇宙视为品牌建设与营销新…

JavaScript - 进阶+高级(笔记)

前言 给孩子点点关注吧&#xff01;&#x1f62d; 本篇文章主要记录以下几部分&#xff1a; 进阶&#xff1a; 作用域&#xff1b;函数进阶&#xff08;函数提升、函数参数、箭头函数&#xff09;&#xff1b;解构赋值&#xff1b;对象进阶&#xff08;构造函数、实例成员、静…

算法记录 | Day57 动态规划

647.回文子串 思路&#xff1a; 1.确定dp数组&#xff08;dp table&#xff09;以及下标的含义&#xff1a; 布尔类型的dp[i][j]&#xff1a;表示区间范围[i,j] &#xff08;注意是左闭右闭&#xff09;的子串是否是回文子串&#xff0c;如果是dp[i][j]为true&#xff0c;否…

【前端】实际开发案例

文章目录 1. 侧边栏2. 调查报告3. 显示隐藏遮罩案列4. 鼠标经过&#xff0c;图片放大5. 奔跑的熊6. 旋转木马7. 百度换肤8. tab栏切换9. 下拉菜单10. 发布留言11. 动态生成表格12. 图片跟随鼠标移动13. 按键输入内容14. 定时器实现15. 发送短信16. 5秒后跳转页面17. 获取URL参数…

Ajax + axios + 常用状态码(笔记)

Ajax 求关注&#x1f62d; 一、客户端与服务器相关的概念 1.1 客户端与服务器 1.1.1 服务器 服务器&#xff1a; 负责 存放 和 对外提供 资源 的 电脑本质&#xff1a; 就是一台电脑&#xff0c;只不过 性能 要比别的电脑 高 1.1.2 客户端 客户端&#xff1a; 在上网过程…

【HttpRunner3】一分钟生成测试用例

【大家好&#xff0c;我是爱干饭的猿&#xff0c;本文重点介绍HttpRunner概念、设计思想和理念、环境搭建、一分钟生成测试用例和脚手架快速创建。 后续会继续分享其他重要知识点总结&#xff0c;如果喜欢这篇文章&#xff0c;点个赞&#x1f44d;&#xff0c;关注一下吧】 上…

成都爱尔李晓峰主任:眼睛干到发出求救信号,快注意!

眼睛总感觉痒痒的&#xff0c;时不时干涩、酸胀、畏光? 它在提醒你&#xff0c;它太干了救救它! 干眼如何判断&#xff1f; 干眼症是由于泪液的质和量异常或者泪液的流体动力学障碍而导致眼表无法保持湿润的一种眼病。会发生眼睛干涩、酸胀、畏光、灼热感、异物感、看东西容易…

Packet Tracer 模拟配置AAA认证

Packet Tracer 模拟配置AAA认证 拓扑图 地址分配表 设备 接口 IP 地址 子网掩码 默认网关 R1 F0/0 172.16.10.1 255.255.255.0 不适用 S0/3/0 10.1.1.1 255.255.255.0 不适用 F0/1 192.168.1.1 255.255.255.0 不适用 R2 F0/0 192.168.2.1 255.255.255.0 …

【云原生】--- Kubernetes原理

Kubernetes原理 一、Kubernets是什么&#xff1f;1、K8s由来2、K8S的作用 二、为什么需要Kubernetes&#xff0c;它能做什么&#xff1f;三、Kubernetes的特性四、Kubernetes架构1、Kubernetes工作流程2、创建pod流程 一、Kubernets是什么&#xff1f; Kubernetes的缩写为&…

Aztec 征求 Rollup Sequencer去中心化提案

1. 引言 前序博客&#xff1a; Rollup去中心化Rollup Decentralization Aztec Rollup中Sequencer角色的主要职责为&#xff1a; 1&#xff09;从mempool中选取pending交易2&#xff09;将选中的pending交易排序打包到L2区块中3&#xff09;验证所有private交易proof以检查其…

(c语言1)阶乘求和

输入格式 求Sn1!2!3!4!5!…n!之值&#xff0c;其中n是一个数字(n不超过20)。 输入格式 n 输出格式 Sn的值 样例输入 5 样例输出 153 题解 然后直接先上题解 #include<stdio.h> int main() {int n,a1;long long sum0,m1; //为这是阶乘求和&#xff0c;一般的i…

第五十三章 Unity 移动平台输入(上)

在移动设备上&#xff0c;Input 类提供对触摸屏、加速度计和地理/位置输入的访问。这里我们简单介绍Input类对于触摸屏的支持。Input.Touches是一个触摸数组&#xff0c;每个数组元素代表着手指在屏幕上的触碰状态Input.Touch。Input.Touch 数据结构表示&#xff1a; fingerId…

带你了解新兴安全技术

随着科技的不断发展&#xff0c;生物识别技术已经成为了一种重要的安全技术。生物识别技术可以通过对个人身份的验证和认证来防止身份盗窃和其他形式的安全威胁&#xff0c;因此越来越多的组织和企业开始使用这种技术来提高安全性。随着科技的不断发展&#xff0c;生物识别技术…

CTFHub-Git泄露-Log

前言 git是一个版本控制工具&#xff0c;通过泄露的.git文件可还原代码 题目如下 wp 1. dirsearch目录扫描 发现存在git泄露&#xff0c;根据提示下载对应git利用工具GitHack&#xff0c;这个工具的特点是能还原历史版本 2. 使用工具下载源码 tips: 最好在linux中操作&…

springboot社区物业管理系统

分享一个springboot社区物业管理系统&#xff0c;需要的私信 项目简介 本系统涉及到的技术主要如下 推荐环境配置&#xff1a;eclipse/idea jdk1.8 maven mysq 前端技术&#xff1a;Layui&#xff0c;Ajax&#xff0c;Json 后端技术&#xff1a;SpringBoot 2.3.0&#xff0c;…

day4-字符设备驱动基础上_基础框架

大纲&#xff1a; 设备分类 申请和注销设备号 函数指针复习 注册字符设备 字符设备驱动框架解析 读操作实现 写操作实现 ioctl操作实现 printk 多个次设备的支持 一、Linux内核对设备的分类 linux的文件种类&#xff1a; -&#xff1a;普通文件 (文件内容、文件名、…

HashMap 的 7 种遍历方式与性能分析

随着 JDK 1.8 Streams API 的发布&#xff0c;使得 HashMap 拥有了更多的遍历的方式&#xff0c;但应该选择那种遍历方式&#xff1f;反而成了一个问题。 本文先从 HashMap 的遍历方法讲起&#xff0c;然后再从性能、原理以及安全性等方面&#xff0c;来分析 HashMap 各种遍历…