当前位置: 首页 > article >正文

RabbitMQ 延迟消息实现:两种方案全解析(TTL+死信 / 延迟插件)实战教程

RabbitMQ 延迟消息实现两种方案全解析TTL死信 / 延迟插件实战教程前言一、延迟消息基础认知延迟消息是什么1.1 定义1.2 典型业务场景1.3 延迟消息流程图通用二、RabbitMQ 实现延迟消息的两种方案方案一TTL 死信队列DLX【原生方案无需插件】方案二RabbitMQ Delayed Message Plugin【官方插件更强大】三、方案一TTL 死信队列 实现延迟消息原生3.1 实现原理最经典3.2 完整流程图3.3 SpringBoot 实战代码1. 配置类核心2. 消费者监听死信队列3. 生产者发送消息3.4 优点与缺点四、方案二延迟插件实现官方推荐最灵活4.1 实现原理4.2 插件版流程图4.3 插件安装步骤4.4 SpringBoot 插件版实战代码1. 配置类2. 生产者动态设置延迟时间3. 消费者4.5 优点与缺点五、两种延迟方案对比面试/生产必看六、生产环境最佳实践七、总结延迟消息实现核心总结文末说明The Begin点点关注收藏不迷路前言在实际业务开发中延迟消息是非常高频的需求订单超时未支付自动取消、用户注册30分钟未完善资料提醒、外卖超时自动退款、预约任务定时执行等。RabbitMQ本身不直接提供延迟队列但可以通过两种成熟方案实现延迟消息本文会详细讲解原理、流程图、代码实战、优缺点对比让你在生产环境中快速落地。一、延迟消息基础认知延迟消息是什么1.1 定义延迟消息消息发送后不立即被消费等待指定延迟时间如15分钟后才会被消费者接收并处理。1.2 典型业务场景订单15分钟未支付 → 自动取消红包24小时未领取 → 自动退回预约服务到期提醒超时未评价自动好评外卖超时自动取消1.3 延迟消息流程图通用生产者发送延迟消息等待延迟时间延迟时间结束消息进入可消费队列消费者接收并处理二、RabbitMQ 实现延迟消息的两种方案RabbitMQ 实现延迟消息有两种标准方案方案一TTL 死信队列DLX【原生方案无需插件】方案二RabbitMQ Delayed Message Plugin【官方插件更强大】下面分别详细讲解。三、方案一TTL 死信队列 实现延迟消息原生3.1 实现原理最经典给队列/消息设置TTL 过期时间延迟时间消息过期后变成死信死信被转发到死信队列消费者监听死信队列→ 实现延迟执行3.2 完整流程图发送消息正常队列设置TTL等待TTL延迟时间消息过期 → 成为死信转发到死信交换机DLX进入死信队列DLQ消费者监听死信队列执行逻辑3.3 SpringBoot 实战代码1. 配置类核心ConfigurationpublicclassTtlDlxConfig{// 正常交换机 队列publicstaticfinalStringNORMAL_EXnormal.exchange;publicstaticfinalStringNORMAL_QUEUEnormal.queue;publicstaticfinalStringNORMAL_RKnormal.rk;// 死信交换机 队列publicstaticfinalStringDLX_EXdlx.exchange;publicstaticfinalStringDLX_QUEUEdlx.queue;publicstaticfinalStringDLX_RKdlx.rk;// 正常队列设置TTL死信BeanpublicQueuenormalQueue(){MapString,ObjectargsnewHashMap();args.put(x-message-ttl,10000);// 延迟10秒args.put(x-dead-letter-exchange,DLX_EX);args.put(x-dead-letter-routing-key,DLX_RK);returnnewQueue(NORMAL_QUEUE,true,false,false,args);}BeanpublicDirectExchangenormalExchange(){returnnewDirectExchange(NORMAL_EX);}BeanpublicBindingnormalBinding(){returnBindingBuilder.bind(normalQueue()).to(normalExchange()).with(NORMAL_RK);}// 死信队列 BeanpublicQueuedlxQueue(){returnnewQueue(DLX_QUEUE);}BeanpublicDirectExchangedlxExchange(){returnnewDirectExchange(DLX_EX);}BeanpublicBindingdlxBinding(){returnBindingBuilder.bind(dlxQueue()).to(dlxExchange()).with(DLX_RK);}}2. 消费者监听死信队列ComponentpublicclassDelayConsumer{// 监听死信队列RabbitListener(queuesTtlDlxConfig.DLX_QUEUE)publicvoidreceive(Stringmsg){System.out.println(延迟消息已消费msg);// 执行取消订单、超时任务...}}3. 生产者发送消息ServicepublicclassDelayProducer{AutowiredprivateRabbitTemplaterabbitTemplate;publicvoidsend(Stringmsg){rabbitTemplate.convertAndSend(TtlDlxConfig.NORMAL_EX,TtlDlxConfig.NORMAL_RK,msg);System.out.println(延迟消息已发送);}}3.4 优点与缺点✅优点无需安装插件原生支持稳定可靠适合固定延迟时间业务❌缺点每一种延迟时间都要创建一个队列10s、30s、60s…消息 TTL 存在懒检查问题会导致延迟不准灵活性差四、方案二延迟插件实现官方推荐最灵活4.1 实现原理安装 RabbitMQ 官方延迟消息插件rabbitmq_delayed_message_exchange创建x-delayed-message 类型交换机发送消息时指定x-delay延迟时间插件内部延迟调度时间到后再路由到队列4.2 插件版流程图发送消息携带x-delay延迟交换机插件内部延迟计时时间到 → 路由到队列消费者正常消费4.3 插件安装步骤下载对应版本插件https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases放到 RabbitMQ 插件目录plugins启用插件rabbitmq-pluginsenablerabbitmq_delayed_message_exchange重启 RabbitMQ4.4 SpringBoot 插件版实战代码1. 配置类ConfigurationpublicclassPluginDelayConfig{publicstaticfinalStringDELAY_EXplugin.delay.exchange;publicstaticfinalStringDELAY_QUEUEplugin.delay.queue;publicstaticfinalStringDELAY_RKplugin.delay.rk;// 声明延迟交换机关键x-delayed-messageBeanpublicCustomExchangedelayExchange(){MapString,ObjectargsnewHashMap();args.put(x-delayed-type,direct);returnnewCustomExchange(DELAY_EX,x-delayed-message,true,false,args);}BeanpublicQueuedelayQueue(){returnnewQueue(DELAY_QUEUE);}BeanpublicBindingdelayBinding(){returnBindingBuilder.bind(delayQueue()).to(delayExchange()).with(DELAY_RK).noargs();}}2. 生产者动态设置延迟时间ServicepublicclassPluginProducer{AutowiredprivateRabbitTemplaterabbitTemplate;publicvoidsend(Stringmsg,IntegerdelayTime){rabbitTemplate.convertAndSend(PluginDelayConfig.DELAY_EX,PluginDelayConfig.DELAY_RK,msg,message-{// 设置延迟时间毫秒message.getMessageProperties().setDelay(delayTime);returnmessage;});}}3. 消费者ComponentpublicclassPluginConsumer{RabbitListener(queuesPluginDelayConfig.DELAY_QUEUE)publicvoidreceive(Stringmsg){System.out.println(插件版延迟消息消费msg);}}4.5 优点与缺点✅优点一个交换机支持任意延迟时间动态设置延迟无需创建多个队列延迟精准无懒检查问题生产环境首选方案❌缺点需要安装插件旧版 RabbitMQ 不支持五、两种延迟方案对比面试/生产必看方案实现方式灵活性延迟精度生产推荐TTL死信原生低固定时间一般有懒检查简单固定场景延迟插件官方插件极高动态时间精准⭐⭐⭐⭐⭐ 强烈推荐六、生产环境最佳实践动态延迟任务优先使用插件版固定延迟如15分钟订单可使用 TTL死信延迟消息必须持久化避免宕机丢失消费者必须手动ACK保证消息可靠消费延迟时间单位毫秒ms七、总结延迟消息实现核心总结RabbitMQ无原生延迟队列必须通过方案实现方案一TTL 死信队列 → 固定延迟、无需插件方案二延迟消息插件 →动态延迟、精准、推荐使用核心用途订单超时取消、任务定时执行生产环境优先选择延迟插件方案掌握延迟消息你就能解决 RabbitMQ 中90%的超时/定时业务场景文末说明本文属于 RabbitMQ 高级实战核心篇后续将更新消息幂等性、高可用集群、流量削峰、消息堆积排查等内容欢迎点赞、收藏、关注The End点点关注收藏不迷路

相关文章:

RabbitMQ 延迟消息实现:两种方案全解析(TTL+死信 / 延迟插件)实战教程

RabbitMQ 延迟消息实现:两种方案全解析(TTL死信 / 延迟插件)实战教程前言一、延迟消息基础认知:延迟消息是什么?1.1 定义1.2 典型业务场景1.3 延迟消息流程图(通用)二、RabbitMQ 实现延迟消息的…...

它不是那种“堆配置”的开发板, 更像是冲着“能直接拿来干活”去的

做嵌入式这些年,大家都有一个感受,现在最贵的,不是芯片,是时间。以前选开发板,很简单:能跑 Linux、接口够用、资料能找到就行,自己要亲自把所有软件硬件都跑一遍,代码甚至都要逐行过…...

RabbitMQ 死信队列(DLX)全面解析:是什么、工作流程、应用场景与实战配置

RabbitMQ 死信队列(DLX)全面解析:是什么、工作流程、应用场景与实战配置前言一、死信队列基础认知:什么是死信队列(DLX)?1.1 官方定义1.2 什么是“死信”?1.3 死信队列完整工作流程图…...

AI逆向|使用AI分析aws-waf-token值的加密并纯算

关注它,不迷路。本文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,否则后果自负,如有侵权,请联系作者立即删除!一.目标地址https://www.imdb.com/二.抓包分析打开控制台后,抓包分析…...

RabbitMQ 消息 TTL 配置:消息过期时间设置全攻略(两种方案+流程图+实战代码)

RabbitMQ 消息 TTL 配置:消息过期时间设置全攻略(两种方案流程图实战代码)前言一、TTL 基础认知:什么是消息 TTL?1.1 TTL 定义1.2 核心作用1.3 TTL 消息流转流程图二、RabbitMQ 配置 TTL 的两种方式三、方式一&#xf…...

Windows Server 2012上IIS配置全攻略:从开启功能到发布第一个网页(附防火墙设置)

Windows Server 2012 IIS配置实战:从零部署企业级Web服务 在企业内部搭建测试环境或部署小型应用时,Windows Server 2012依然是一个稳定可靠的选择。作为微软服务器操作系统家族的重要成员,其内置的IIS(Internet Information Serv…...

别再傻傻分不清了!从光线投射到路径追踪,一张图看懂光线追踪的进化史

从光线投射到路径追踪:计算机图形学的光影革命 当你在玩最新3A游戏时,是否曾被逼真的水面反射和细腻的阴影效果震撼?这背后是光线追踪技术数十年的演进成果。本文将带你穿越时空,从1960年代的光线投射开始,一步步解析光…...

保姆级避坑指南:在ROS Kinetic上从源码编译TurtleBot3仿真包(含Gazebo环境变量报错解决)

从零构建TurtleBot3仿真环境:ROS Kinetic深度避坑实战 第一次在ROS Kinetic上手动编译TurtleBot3仿真包时,我盯着屏幕上CMake报出的turtlebot3_msgs not found错误发了半小时呆。官方Wiki看似步骤清晰,但实际操作中那些未提及的依赖关系和环境…...

深入解析ES正排索引:从doc_values与fielddata的演进看性能与稳定性抉择

1. 正排索引:被忽视的ES性能基石 第一次接触Elasticsearch的开发者往往会被其强大的搜索能力吸引,却忽略了背后支撑聚合、排序等关键功能的正排索引机制。记得2015年我在电商平台处理千万级商品数据时,就曾因为错误配置fielddata导致集群频繁…...

Kali Linux 2024.1 上 Zsh + Oh My Zsh 保姆级配置指南(含国内网络加速方案)

Kali Linux 2024.1 极速配置 Zsh Oh My Zsh 全攻略 作为安全研究人员和开发者的标配系统,Kali Linux 在2024.1版本中已经全面拥抱Zsh作为默认Shell。但国内用户在配置过程中最头疼的莫过于Oh My Zsh的安装问题——那些看似简单的curl命令总是因为网络问题而失败。本…...

CSS如何实现优雅的间距_使用CSS Grid控制盒模型间隙

grid-gap 被弃用是因为 CSS Grid Level 2 规范将其标记为过时,统一改用 gap;它现支持 Grid、Flexbox 和多列布局,但 IE 完全不支持,且 gap 不继承、不与 margin 叠加抵消,subgrid 也不继承父级 gap。grid-gap 为什么被…...

技术深度解析:JPEXS Free Flash Decompiler的逆向工程架构与实现原理

技术深度解析:JPEXS Free Flash Decompiler的逆向工程架构与实现原理 【免费下载链接】jpexs-decompiler JPEXS Free Flash Decompiler 项目地址: https://gitcode.com/gh_mirrors/jp/jpexs-decompiler 在Flash技术被主流浏览器弃用后,大量遗留的…...

如何在 WordPress 中通过邮箱获取用户 ID(PHP 实现)

...

低质代码泛滥:根源与整治

一场席卷软件工程的质量风暴 在当今数字化浪潮下,代码正以前所未有的速度被生产出来。随着AI编程工具的普及,某些案例显示单月代码生成量激增十倍,从数万行跃升至数十万行。全球代码库的年增速超过百分之三十,与此同时&#xff0…...

ANSYS新手必看:如何用虚功原理简化有限元分析(附推导步骤)

ANSYS实战指南:虚功原理在有限元分析中的高效应用 刚接触有限元分析时,我总被那些复杂的数学推导吓退,直到发现虚功原理这个"翻译官"——它能将工程师的物理直觉转化为软件能理解的数学语言。在ANSYS中应用虚功原理,就像…...

Harness Engineering 入门指南:从提示词到AI系统设计的完整跃迁

很多人觉得AI应用做不好,要么是模型不够强,要么是提示词写得不够好。但2026年开发者圈子正在达成一个新共识:AI落地的核心瓶颈根本不在模型,而在那套控制它不乱跑的「缰绳系统」。 这套系统的设计方法,就是现在火遍全网…...

ABAQUS实战技巧:集中质量与耦合约束的协同设置方法

1. 集中质量与耦合约束的基础概念 在ABAQUS有限元分析中,集中质量(Point Mass)是一种常用的简化建模技术。它允许我们将结构的某部分质量浓缩到一个几何点上,而不是详细建模该部分的所有几何特征。这种技术特别适用于以下场景&…...

用CubeMX+Keil五分钟搞定STM32F4 ADC配置:含多通道扫描模式实战

用STM32CubeMXKeil实现高效ADC配置:从单通道到多通道扫描实战 对于刚接触STM32开发的工程师来说,ADC(模数转换器)配置往往是第一个需要跨越的技术门槛。传统的手动寄存器配置方式虽然灵活,但对于项目周期紧张或刚入门的…...

Redis怎样向Lua脚本传递动态参数

Redis Lua脚本通过KEYS和ARGV接收参数:KEYS存显式声明的key名,ARGV存动态值参数;必须用ARGV传递所有非key参数,避免拼接注入,并注意字符串类型转换与空值处理。Redis Lua脚本里怎么接收外部传进来的参数Redis 执行 EVA…...

Agent 记忆系统设计:短期、长期到知识图谱

一句话定义 Agent 记忆系统 让 AI 像人一样,把「刚刚发生的」「学过的」「长期积累的」分层管理。 类比:人类的记忆分三层——工作记忆(当前对话的上下文,几分钟内)、情节记忆(某件具体的事,…...

从源码编译到驱动部署:Windows Qt环境下QMYSQL驱动缺失的完整修复指南

1. 问题背景与诊断 当你第一次在Windows上用Qt连接MySQL数据库时,那个刺眼的"Driver not loaded"错误提示是不是让你瞬间头皮发麻?别担心,这几乎是每个Qt开发者都会遇到的经典问题。我清楚地记得自己第一次遇到这个报错时&#xff…...

8卡海光Z100L服务器实战:手把手教你用vLLM部署32B大模型(附完整镜像与配置)

8卡海光Z100L服务器实战:从零部署Qwen2.5-32B大模型全流程指南 国产化算力平台正在成为AI基础设施的新选择。海光Z100L作为国产高性能计算卡的代表,其8卡服务器的配置足以承载32B参数规模的大模型推理。本文将完整呈现从硬件验收到模型服务的全链路操作&…...

STM32F103用FSMC驱动ILI9341屏幕,我踩过的那些坑(附完整代码)

STM32F103用FSMC驱动ILI9341屏幕的五大实战陷阱与解决方案 当我在第一次尝试用STM32F103的FSMC接口驱动ILI9341液晶屏时,本以为按照手册连接好线就能轻松点亮,结果却遭遇了各种意想不到的问题。从硬件连接到软件配置,几乎每一步都藏着"坑…...

告别Servo库!手把手教你用Arduino UNO的PWM引脚直接驱动舵机(附串口控制代码)

Arduino舵机控制终极指南:从底层PWM到串口交互实战 在创客和机器人项目中,舵机控制是最基础却至关重要的技能之一。市面上大多数教程都依赖现成的Servo库,这虽然简化了开发流程,却也让我们错过了理解底层原理的机会。本文将带你深…...

别只盯着密码锁!用C51单片机+4x4键盘,我还能玩出这些花样(附代码思路)

突破密码锁边界:C51单片机4x4键盘的创意开发指南 当你已经用C51单片机和4x4矩阵键盘完成了一个基础密码锁项目后,是否想过这套硬件还能玩出什么新花样?实际上,这套组合的开发潜力远不止于此。本文将带你探索四种完全不同的应用方向…...

GT2440开发板RT3070L USB WiFi网卡DHCP客户端移植实战:从源码编译到网络配置

1. RT3070L USB WiFi网卡与GT2440开发板简介 GT2440是一款基于三星S3C2440处理器的经典嵌入式开发板,广泛应用于工业控制和物联网设备开发。这款开发板虽然性能不算顶尖,但胜在稳定可靠,社区支持完善,是学习嵌入式开发的绝佳平台。…...

# 发散创新:用Go语言打造绿色计算的高效任务调度器在当今算力飞速增长的

发散创新:用Go语言打造绿色计算的高效任务调度器 在当今算力飞速增长的时代,绿色计算已成为不可逆的趋势。它不仅关乎节能减排,更体现在资源利用率、能耗感知与动态优化上。本文将带你从底层出发,使用 Go 语言 实现一个轻量级但功…...

基于单片机的智能泡茶机设计(有完整资料)

资料查找方式:特纳斯电子(电子校园网):搜索下面编号即可编号:T1172310M设计简介:吧电源: 5V 传感器:温度传感器(DS18B20)、水位传感器(Water Sens…...

STM32烧录程序全攻略:从ST-LINK到USB转TTL,手把手教你避坑

STM32烧录程序实战指南:工具选择与避坑手册 第一次拿到STM32开发板时,看着密密麻麻的引脚和一堆专业术语,很多初学者都会感到无从下手。烧录程序作为嵌入式开发的第一步,往往成为新手遇到的第一个技术门槛。本文将带你深入理解不…...

2026年本地1分钟喂奶级集成OpenClaw及大模型百炼APIKey教程

2026年本地1分钟喂奶级集成OpenClaw及大模型百炼APIKey教程。还在为部署OpenClaw到处找教程踩坑吗?别再瞎折腾了!OpenClaw一键部署攻略来了,无需代码、只需两步,新手小白也能轻松拥有专属AI助理! 一、先搞懂&#xff1…...