详细介绍:【rabbitmq 高级特性】全面详解RabbitMQ TTL (Time To Live)

news/2025/10/14 12:46:23/文章来源:https://www.cnblogs.com/ljbguanli/p/19140451

详细介绍:【rabbitmq 高级特性】全面详解RabbitMQ TTL (Time To Live)

目录

一、核心概念:为什么需要TTL?

二、设置TTL的两种方法

三、代码实战:两种TTL的配置与使用

四、两种TTL的内部原理与区别

五、应用:结合死信队列

总结


一、核心概念:为什么需要TTL?

在许多业务场景中,消息并非需要永久有效。例如:

  • 订单超时关闭​:下单后15分钟未支付,订单自动失效。

  • 限时优惠券​:发放的优惠券仅在24小时内有效。

  • 预约提醒​:预约会议开始前15分钟发送提醒消息。

TTL机制就是为了满足这类需求而设计的。​RabbitMQ允许你为单条消息或整个队列设置一个生存时间。一旦消息在队列中存活的时间超过了设置的TTL,它就会自动被删除(或成为死信,如果配置了死信队列的话)。​

二、设置TTL的两种方法

RabbitMQ提供了两种方式来设置消息的TTL,它们的生效时机和行为有重要区别。

1. 为单条消息设置TTL (Per-Message TTL)​

在生产者发送消息时,为每一条消息单独设置过期时间。

2. 为队列设置TTL (Queue TTL)​

在声明队列时,为整个队列设置一个统一的消息过期时间。所有被投递到这个队列的消息,都将继承这个统一的TTL值。

3. 两种TTL的优先级

如果一条消息同时设置了消息TTL队列TTL,​RabbitMQ会取两者中较小的那个值作为该消息的实际TTL。

下图清晰地展示了两种TTL的设置方式、生效时机以及最终的消息流向:

三、代码实战:两种TTL的配置与使用

我们基于Spring AMQP来演示两种TTL的用法。

1. 公共配置(声明交换机和队列)​

public class Constant {// TTLpublic static final String TTL_QUEUE = "ttl_queue"; // 用于测试消息TTLpublic static final String TTL_QUEUE2 = "ttl_queue2"; // 用于测试队列TTLpublic static final String TTL_EXCHANGE_NAME = "ttl_exchange";
}
@Configuration
public class TtlConfig {// 1. 交换机@Bean("ttlExchange")public FanoutExchange ttlExchange() {return ExchangeBuilder.fanoutExchange(Constant.TTL_EXCHANGE_NAME).durable(true).build();}// 2.1 普通队列(用于后续测试消息TTL)@Bean("ttlQueue")public Queue ttlQueue() {return QueueBuilder.durable(Constant.TTL_QUEUE).build();}// 2.2 设置队列TTL的队列(20秒)@Bean("ttlQueue2")public Queue ttlQueue2() {return QueueBuilder.durable(Constant.TTL_QUEUE2).withArgument("x-message-ttl", 20000) // 关键参数:设置队列TTL为20秒.build();}// 使用.ttl()方法简写(Spring AMQP封装)// public Queue ttlQueue2() {//     return QueueBuilder.durable(Constant.TTL_QUEUE2)//             .ttl(20000)//             .build();// }// 3. 绑定关系@Bean("ttlBinding")public Binding ttlBinding(@Qualifier("ttlExchange") FanoutExchange exchange,@Qualifier("ttlQueue") Queue queue) {return BindingBuilder.bind(queue).to(exchange);}@Bean("ttlBinding2")public Binding ttlBinding2(@Qualifier("ttlExchange") FanoutExchange exchange,@Qualifier("ttlQueue2") Queue queue) {return BindingBuilder.bind(queue).to(exchange);}
}

2. 生产者:发送带TTL的消息

@RestController
@RequestMapping("/producer")
public class ProducerController {@Autowiredprivate RabbitTemplate rabbitTemplate;// 测试1:发送带消息TTL的消息 (10秒)@RequestMapping("/ttlmsg")public String sendMessageWithTtl() {String ttlTime = "10000"; // 10秒rabbitTemplate.convertAndSend(Constant.TTL_EXCHANGE_NAME, "","This is a message with 10s TTL",message -> {// 关键:为单条消息设置TTL属性message.getMessageProperties().setExpiration(ttlTime);return message;});return "发送成功! 消息将在10秒后过期。";}// 测试2:发送到带队列TTL的队列 (队列TTL为20秒)@RequestMapping("/ttlqueue")public String sendMessageToTtlQueue() {// 这条消息会继承队列的TTL设置,20秒后过期rabbitTemplate.convertAndSend(Constant.TTL_EXCHANGE_NAME, "","This is a message in a 20s TTL queue");return "发送成功! 消息将在20秒后过期。";}
}

3. 观察结果

运行程序,调用两个接口后,在RabbitMQ管理界面可以看到:

  1. ttl_queue2的 ​Features​ 会显示 ​TTL​ 标志,表示这是一个设置了TTL的队列。

  2. 发送消息后,队列中的 ​Ready​ 消息数为1。

  3. 等待相应的秒数(10秒或20秒)后刷新页面,会发现消息自动消失了(如果队列未配置死信交换机)。

四、两种TTL的内部原理与区别

特性

消息TTL (Per-Message)

队列TTL (Queue)

设置位置

消息属性 (expiration)

队列参数 (x-message-ttl)

灵活性

高,每条消息可以不同

低,队列内所有消息相同

生效时机

惰性检查​:消息并非在到期时立刻被删除,而是只有在即将被投递给消费者时才会检查是否过期。

主动检查​:RabbitMQ会定期从队列头部开始扫描并删除已过期的消息。

性能影响

不影响。因为过期消息只在被投递时才会被清理。

有较小影响。Broker需要后台任务定期扫描队列。

适用场景

需要为不同消息设置不同过期时间的场景。

队列中所有消息具有相同过期时间的场景,配置更简单。

为什么会有不同的生效机制?​

  • 队列TTL​:队列中的消息过期时间相同,过期的消息肯定集中在队列头部,只需定期扫描头部即可,效率高。

  • 消息TTL​:每条消息的过期时间都不同,如果要立即删除过期消息,需要遍历整个队列,性能开销巨大。因此采用惰性检查,在消费时再判断,是性能与功能的最佳权衡。

五、应用:结合死信队列

单纯让消息过期后消失通常没有业务意义。​TTL的真正威力在于与死信队列(DLX)结合使用,实现延迟队列和定时任务。​

工作流程​(对应上方流程图):

  1. 创建一个普通队列 normal_queue,并为其设置:

    • x-message-ttl=10000(TTL=10秒)

    • x-dead-letter-exchange=dlx_exchange(绑定死信交换机)

  2. 消费者不监听 normal_queue,而是监听绑定的死信队列 dlx_queue

  3. 生产者将消息发送到 normal_queue

  4. 消息在 normal_queue中存活10秒后过期。

  5. 由于配置了DLX,过期的消息不会消失,而是被自动转发到 dlx_exchange,并路由到 dlx_queue

  6. 消费者从 dlx_queue中消费到消息。此时,从消息发送到被消费,正好延迟了10秒。

这样就实现了一个延迟队列,可用于处理订单超时关单等场景。


总结

TTL是RabbitMQ中一个非常实用的高级特性,它通过两种方式为消息赋予了“生命周期”:

  1. 消息TTL​:提供了灵活性,允许细粒度控制每条消息的过期时间。

  2. 队列TTL​:提供了便利性,为一批消息提供统一的过期配置。

核心要点​:

  • 理解两者不同的生效机制​(惰性检查 vs. 主动扫描)及其背后的原因。

  • TTL通常不会单独使用,其最佳实践是与死信队列(DLX)结合来构建延迟队列,解决如订单超时、定时任务等经典业务问题。

  • 在选择使用哪种TTL时,根据业务的灵活性和简便性要求做出权衡。

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

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

相关文章

第三台中转机实现远程scp文件到远程

点击查看代码 命令 scp -3r user@ip:/path/file user@ip:/path/ 远程主机(源)-》中转机-》远程主机(目标)如果要实现免密需要 ssh-copy-id user@ip 将本地的 SSH 公钥快速复制到远程主机的 ~/.ssh/authorized_key…

单片机使用同一硬件定时器实现多周期定时功能

一个复杂的单片机程序可能需要很多种周期不同的定时器,用于执行不同的任务,如传感器数据采集、显示设备刷新或者执行设备的驱动等。如果每种周期使用一个单片机的硬件定时器将很难实现全部的功能需求,本文记录一种简…

(二十六)、Kuboard 部署网络问题 k8s 使用本地镜像 k8s使用 register本地镜像站 综合应用 - 实践

(二十六)、Kuboard 部署网络问题 &k8s 使用本地镜像 & k8s使用 register本地镜像站 综合应用 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; displa…

低代码平台底层协议设计

低代码平台底层协议设计 1. 核心协议架构 1.1 协议分层设计 // 低代码平台协议栈 interface LowCodeProtocolStack {// 1. 传输层协议transport: TransportProtocol;// 2. 数据描述协议schema: SchemaProtocol;// 3. 组…

从PHP到Spring Boot:思维的转变与入门实战 (指南二) - 教程

从PHP到Spring Boot:思维的转变与入门实战 (指南二) - 教程2025-10-14 12:27 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !impor…

Vue 低代码平台渲染引擎设计

Vue 低代码平台渲染引擎设计 1. 核心架构设计 1.1 整体架构 // 渲染引擎核心接口定义 interface RenderEngine {schema: PageSchema; // 页面Schemacomponents: ComponentMap; // 组件映射dataSource: D…

微前端架构:实战指南与未来趋势 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

基于海思Hi3798MV200 Android7.0达成电影播放蓝光导航功能

基于海思Hi3798MV200 Android7.0达成电影播放蓝光导航功能pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consola…

2025 年热处理钎焊炉工装夹具厂家推荐榜:钎焊炉用耐热钢工装夹具厂家,聚焦品质与适配,助力企业高效生产

随着制造业对热处理工艺精度要求的不断提升、设备耐用性需求增强及生产标准化推进,热处理钎焊炉工装夹具已从高端冶金、核工业领域逐步拓展至石油、化工、电力、矿山等多个行业,2025 年市场规模预计持续增长。但市场…

实用指南:基于Spring Boot与SSM的社团管理系统架构设计

实用指南:基于Spring Boot与SSM的社团管理系统架构设计pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&…

请求超时重试封装

请求超时重试封装 1. 基础版本 - 带指数退避的重试机制 interface RetryConfig {maxRetries?: number; // 最大重试次数baseDelay?: number; // 基础延迟时间(ms)timeout?: number; …

完整教程:数据结构 01 线性表

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

编程脉络梳理

编程脉络梳理编程脉络梳理 Java基础 源码和原理ThreadLocal 内存溢出问题 和 java引用类型定时任务Timer的原理和使用hashMap扩容和转红黑树条件Serializable接口 和 serialVersionUID 的关系指针压缩原理和为什么指针…

Emacs常用的一些快捷键,记不住的,方便查询!!

emacs 快捷键 基本快捷键(Basic) C-x C-f "find"文件, 即在缓冲区打开/新建一个文件 C-x C-s 保存文件 C-x C-w 使用其他文件名另存为文件 C-x C-v 关闭当前缓冲区文件并打开新文件 C-x i 在当前光标处插入文…

Microsoft Visual C++,Microsoft Visual Studio for Office Runtime,Microsoft Visual Basic Runtime等下载

Visual C++ 运行库合集(VCRedistPack),“缺少运行库”报错等问题修复 这个没什么好说的,就是解决常见的Visual C++ 运行库问题,一搬安装软件,比如PS,CAD等,也有因为安装游戏时出现的一些未知错误,“缺少运行库…

2025 年耐热钢厂家及热处理工装设备厂家推荐榜:多用炉/真空炉/台车炉/井式炉/箱式炉/耐热钢工装厂家,聚焦高效适配,助力企业精准选型

随着工业制造向高端化、精密化升级,热处理、冶金、石化等行业对耐热钢材料及专用工装设备的性能要求持续提升,兼具耐高温、耐腐蚀、高强度特性的耐热钢产品,已成为保障生产稳定性、提升工艺水平的核心要素。2025 年…

实用指南:如何进行WGBS的数据挖掘——从甲基化水平到功能通路

实用指南:如何进行WGBS的数据挖掘——从甲基化水平到功能通路pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Con…

python对接印度尼西亚股票数据接口文档

概述 StockTV 提供全面的印度尼西亚股票市场数据接口,覆盖印尼证券交易所(IDX)所有上市公司。支持实时行情、技术分析、公司信息等多种功能。 交易所信息交易所: 印尼证券交易所 (Indonesia Stock Exchange, IDX) 国…

实用指南:Python学习历程——基础语法(print打印、变量、运算)

实用指南:Python学习历程——基础语法(print打印、变量、运算)2025-10-14 11:59 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !im…

2025年舒适轮胎厂家最新权威推荐榜:静音耐磨,驾驶体验全面升级!

2025年舒适轮胎厂家最新权威推荐榜:静音耐磨,驾驶体验全面升级!随着汽车行业的快速发展,消费者对驾驶体验的要求越来越高。舒适轮胎作为提升驾驶体验的关键因素之一,其市场需求也日益增长。为了帮助筛选舒适轮胎品…