RocketMQ延迟消息实现原理解析

一、核心原理概述

RocketMQ的延迟消息实现采用"预置延迟等级 + 定时扫描转发"的机制,并非真正的实时延迟,就是通过预定延迟等级将消息暂存到特定队列,等待时间到达后再投递给消费者。

1. 实现方式

RocketMQ 将延时消息转换为普通消息,通过SCHEDULE_TOPIC_XXXX主题进行分级存储和消费。

2. 延迟级别

RocketMQ 一共支持18个等级的延迟投递,具体时间如下:

投递等级(delay level)延迟时间投递等级(delay level)延迟时间
11s106min
25s117min
310s128min
430s139min
51min1410min
62min1520min
73min1630min
84min171h
95min182h
// RocketMQ预定义的18个延迟等级 private String messageDelayLevel = "1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h"; // 对应18个SCHEDULE_TOPIC_XXXX队列

3. 整体流程

二、核心实现步骤

发送阶段

java // 生产者发送延迟消息 Message msg = new Message("TestTopic", "Hello RocketMQ".getBytes()); // 设置延迟级别(对应上面级别的索引,从1开始) msg.setDelayTimeLevel(3); // 延迟10秒 producer.send(msg);

内部转换流程

  1. 消息标记:Broker 收到延迟消息后,将原 Topic 和 QueueId 存入消息属性

  2. 主题切换:将消息的实际 Topic 改为SCHEDULE_TOPIC_XXXX

  3. 队列分配:根据延迟级别分配到对应的延迟队列

    • 延迟级别1 → SCHEDULE_TOPIC_XXXX 的 Queue 0

    • 延迟级别2 → SCHEDULE_TOPIC_XXXX 的 Queue 1

    • ...

    • 每个延迟级别对应一个专门的队列

定时扫描机制

java // 简化后的处理逻辑 class ScheduleMessageService { // 定时任务,每秒执行一次 (实际会根据延迟级别进行分级延迟扫描) public void start() { for (int level = 1; level <= maxDelayLevel; level++) { // 计算当前级别对应的延迟时间 long delayTime = computeDeliverTimestamp(level); // 扫描对应队列中到期的消息 scanAndDeliver(level, delayTime); } } }

消息投递

  1. 扫描到期消息:每个延迟队列有独立的定时任务,按时间轮询扫描

  2. 恢复原主题:从消息属性中取出原始 Topic 和 QueueId

  3. 重新投递:将消息存入原始 Topic 的 CommitLog

  4. 消费者消费:消费者从原始 Topic 正常消费消息

三、 存储结构

四、Broker核心处理流程

五、 限制与改进

配置延迟级别

properties # broker.conf messageDelayLevel=1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h

重要限制

  1. 固定延迟级别:不支持任意时间延迟,只能使用预设级别

  2. 时间精度:秒级精度

  3. 最大延迟:默认最长2小时(可配置)

  4. 消息顺序:延迟消息会破坏严格的消息顺序

5.0+ 版本改进

RocketMQ 5.0 引入了TimerWheel(时间轮)优化:

  • 支持任意时间延迟(毫秒级精度)

  • 更高的性能,O(1) 时间复杂度

  • 支持更长的延迟时间(数天级别)

最佳实践

java // 最佳实践 public class DelayMessageExample { public void sendDelayMessage() { Message msg = new Message("OrderTopic", "订单超时取消".getBytes()); // 根据业务需求选择合适的延迟级别 // 订单超时:30分钟 → level 16 // 支付提醒:15分钟 → 可选择10m或20m级别 msg.setDelayTimeLevel(16); // 30分钟 // 消息去重:延迟消息可能需要配合唯一Key msg.setKeys("ORDER_123456"); producer.send(msg); } }

总结

RocketMQ 延迟消息通过"主题转换 + 分级延迟队列 + 定时扫描"实现,虽然不支持任意时间点延迟,但满足了大多数业务场景(如订单超时、定时提醒等)。对于更灵活的延迟需求,可考虑升级到 5.0+ 版本或使用时间轮实现。

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

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

相关文章

django-flask基于python的高校在线考试系统设计与实现

目录高校在线考试系统设计与实现摘要关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;高校在线考试系统设计与实现摘要 随着信息技术的快速发展&#xff0c;传统纸质考试方式在效率、…

架构 CPU SOC 核心板

1. 架构 & CPU & SOC 先有架构&#xff0c;再有内核&#xff0c;一个架构可以衍生出多种内核 内核之所以称之为内核&#xff0c;是因为他是在SOC、MCU内部中最核心的逻辑处理部分&#xff0c;就是SOC、MCU的CPU。所以内核也可以叫做处理器。 别的公司可以向ARM公司购买…

【计算机毕业设计案例】基于JavaSpribgBoot的水果生鲜团购平台基于SpribgBoot的生鲜团购平台(程序+文档+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

【电动机】液压伺服电动机的状态空间设计与Matlab仿真

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 &#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室 &#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#x1…

解决word分栏问题

“Word分为左右两版”通常有两种情况&#xff1a;一种是你故意设置了分栏排版&#xff08;像报纸那样&#xff09;&#xff0c;想要恢复或调整&#xff1b;另一种是你无意中触碰了设置&#xff0c;导致视图显示变成了两页并排。为了帮你彻底解决这个问题&#xff0c;我将针对这…

Java计算机毕设之基于SpribgBoot的每日生鲜电商平台生鲜团购平台基于SpribgBoot的生鲜团购平台(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

「数据获取」全国民用运输机场吞吐量排名(2006-2024)

01、数据简介数据概况以2024年中国民用运输机场吞吐量排名为例&#xff0c;指标为&#xff1a;机场名、旅客吞吐量&#xff08;人&#xff09;&#xff08;名次、本期完成、上年同期、比上年同期增减%&#xff09;、货邮吞吐量&#xff08;吨&#xff09;&#xff08;名次、本期…

「数据获取」内蒙古地理基础数据(道路、水系、四级行政边界、地级城市、DEM等)

01、数据简介数据概况内蒙古地理基础数据&#xff08;道路、水系、四级行政边界、地级城市、DEM等&#xff09;&#xff0c;数据为SHP格式。请自行斟酌使用。内蒙古简介内蒙古自治区位于中国北部边疆&#xff0c;森林、牧场广阔&#xff0c;地下资源丰富&#xff0c;降雨量从东…

Java毕设项目:基于vue的社区生鲜团购在线管理平台基于SpribgBoot的生鲜团购平台(源码+文档,讲解、调试运行,定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

智界·无界:高德开发者生态大会深度观察与技术巡礼

在地理信息系统&#xff08;GIS&#xff09;与移动互联网深度融合的当下&#xff0c;高德地图作为行业内的基础设施提供者&#xff0c;其开发者生态的动向往往预示着位置服务&#xff08;LBS&#xff09;技术的下一个风口。本次参与高德开发者大会&#xff0c;不仅仅是一次简单…

【PID优化】基于粒子群算法的自动发电控制AGC系统 PID参数智能整定,两区域负荷频率控制附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 &#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室 &#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#x1…

学霸同款10个AI论文网站,MBA毕业论文轻松搞定!

学霸同款10个AI论文网站&#xff0c;MBA毕业论文轻松搞定&#xff01; AI 工具助力论文写作&#xff0c;高效又省心 在当今这个信息爆炸的时代&#xff0c;MBA 学习者和研究者面对的不仅是繁重的课程压力&#xff0c;还有日益复杂的论文写作任务。如何在有限的时间内完成高质量…

【剑斩OFFER】算法的暴力美学——leetCode 515 题:在每个树行中找到最大值

一、题目描述二、算法原理思路&#xff1a;层序遍历每一层的最大值三、代码实现/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* Tr…

【数据分享】上市公司数据资产(2003-2024年)

而今天要限时免费分享的数据就是上市公司数据资产&#xff08;2003-2024年&#xff09; 数据介绍 数据概况 数据名称&#xff1a;上市公司数据资产&#xff08;2003-2024年&#xff09; 数据年份&#xff1a;2003-2024年 数据范围&#xff1a;A股上市公司 数据来源&#x…

计算机Java毕设实战-基于SpringBoot的水族馆商品销售与经营管理系统基于vue的水族馆观赏鱼商品销售与经营管理系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

【水果检测】基于计算机视觉的植物果实检测方法研究与Matlab仿真

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 &#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室 &#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#x1…

【数据分享】青海路网数据青海路网分类数据(2025年)

而今天要说明数据就是青海路网数据青海路网分类数据(2025年) 数据概况 数据含城市次干道、城市支路、城市主干道、高架及快速路、郊区乡村道路、内部道路、人行道路、自行车道等&#xff08;具体请看截图&#xff0c;有些省份可能无法分类出自行车道&#xff09;。数据源自&a…

计算机Java毕设实战-基于SpribgBoot的有机食品生鲜团购平台基于SpribgBoot的生鲜团购平台【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

学霸同款MBA必看!8个AI论文平台TOP8测评

学霸同款MBA必看&#xff01;8个AI论文平台TOP8测评 2026年MBA学术写作工具测评&#xff1a;为何需要一份权威榜单&#xff1f; 在MBA学习与研究过程中&#xff0c;论文撰写是不可或缺的一环。然而&#xff0c;面对繁重的课程任务和高强度的实践项目&#xff0c;如何高效完成高…

智能降重有妙招:8款AI工具提升论文查重效率

学术写作中&#xff0c;查重率是衡量研究规范性的重要指标&#xff0c;但过高的重复率常给作者带来修改负担。为平衡学术严谨性与文本原创性&#xff0c;现代自然语言处理技术驱动的智能工具应运而生&#xff0c;它们能在保留核心语义的前提下对文本进行深度重构&#xff0c;显…