RocketMQ定时/延时消息实现机制
RocketMQ 的延迟消息是其核心特性之一,允许消息在指定延迟时间后才被消费者消费。
定时消息生命周期

一、延迟消息的核心机制
- RocketMQ(
5.0之前) 不支持任意时间精度的延迟,而是通过预定义的 延迟级别(Delay Level) 实现。默认支持 18 个延迟级别,对应延迟时间如下:
1s, 5s, 10s, 30s, 1m, 2m, 3m, 4m, 5m, 6m, 7m, 8m, 9m, 10m, 20m, 30m, 1h, 2h
消息发送时指定延迟级别,Broker 会将消息暂存到内部 Topic(SCHEDULE_TOPIC_XXXX),这个topic下对应着这18个延迟级别的队列,到期后投递到目标 Topic。
- RocketMQ
5.0之后支持任意时间精度的延迟,内部是通过时间轮算法实现的消息延迟功能。
定时消息仅支持在 MessageType为Delay 的主题内使用,即定时消息只能发送至类型为定时消息的主题中,发送的消息的类型必须和主题的类型一致。
RocketMQ 定时消息的定时时长参数精确到毫秒级,但是默认精度为1000ms,即定时消息为秒级精度。
二、使用方式
- 发送消息时设置延迟级别:
Message msg = new Message("TopicTest", "TagA", "Hello RocketMQ".getBytes());
// 设置延迟级别为 2(对应 5s)
msg.setDelayTimeLevel(2);
SendResult sendResult = producer.send(msg);
- 发送消息时设置延迟时间
//定时/延时消息发送MessageBuilder messageBuilder = new MessageBuilderImpl();;//以下示例表示:延迟时间为10分钟之后的Unix时间戳。Long deliverTimeStamp = System.currentTimeMillis() + 10L * 60 * 1000;Message message = messageBuilder.setTopic("topic")//设置消息索引键,可根据关键字精确查找某条消息。.setKeys("messageKey")//设置消息Tag,用于消费端根据指定Tag过滤消息。.setTag("messageTag").setDeliveryTimestamp(deliverTimeStamp)//消息体.setBody("messageBody".getBytes()).build();try {//发送消息,需要关注发送结果,并捕获失败等异常。SendReceipt sendReceipt = producer.send(message);System.out.println(sendReceipt.getMessageId());} catch (ClientException e) {e.printStackTrace();}
三、源码实现分析
1. 消息存储阶段
-
CommitLog 存储
消息写入 CommitLog 前,Broker 检测delayTimeLevel:- 若为延迟消息,替换 Topic 为
SCHEDULE_TOPIC_XXXX,队列 ID 为delayLevel - 1。 - 源码位置:
org.apache.rocketmq.store.CommitLog#putMessage
- 若为延迟消息,替换 Topic 为
-
延迟队列 Topic
每个延迟级别对应一个队列,例如 Level 2 存储在SCHEDULE_TOPIC_XXXX的队列 1 中。
2. 延迟消息调度
-
ScheduleMessageService
核心调度服务,启动时初始化定时任务:public void start() {for (int i = 0; i < this.delayLevelTable.size(); i++) {int delayLevel = i + 1;this.scheduleExecutorService.schedule(new DeliverDelayedMessageTimerTask(delayLevel), this.firstDelayTime, TimeUnit.MILLISECONDS);} }- 每个延迟级别对应一个
DeliverDelayedMessageTimerTask定时任务。 - 定时扫描对应队列,将到期消息投递到目标 Topic。
- 每个延迟级别对应一个
-
消息投递逻辑
- 计算消息的 到期时间(存储时间 + 延迟时间)。
- 若当前时间 >= 到期时间,从延迟队列拉取消息,恢复原始 Topic/QueueId,重新存入 CommitLog。
- 源码位置:
DeliverDelayedMessageTimerTask#executeOnTime
3. 消费者可见性
- 消息在延迟期间对消费者不可见,到期投递到原 Topic 后,消费者才能拉取。
四、关键配置
- Broker 配置
修改messageDelayLevel参数可自定义延迟级别(需重启 Broker):messageDelayLevel=1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h
五、设计思考
-
固定延迟级别 vs 任意延迟
RocketMQ 采用固定级别避免为每个消息创建 Timer,减少资源消耗。定时任务按队列批量处理,效率更高。 -
性能优化
延迟消息的存储和普通消息共用 CommitLog,通过 Topic 和队列切换实现逻辑隔离,保证写入性能。
六、注意事项
- 延迟精度:受定时任务扫描间隔影响,可能存在微小误差。
- 消息重试:若消费失败,消息进入重试队列(非延迟队列)。
- 避免大量相同定时时刻的消息:定时消息的实现逻辑需要先经过定时存储等待触发,定时时间到达后才会被投递给消费者。因此,如果将大量定时消息的定时时间设置为同一时刻,则到达该时刻后会有大量消息同时需要被处理,会造成系统压力过大,导致消息分发延迟,影响定时精度。
通过上述机制,RocketMQ 以较低成本实现了高吞吐量的延迟消息功能,适用于订单超时、定时任务等场景。
相关文章:
RocketMQ定时/延时消息实现机制
RocketMQ 的延迟消息是其核心特性之一,允许消息在指定延迟时间后才被消费者消费。 定时消息生命周期 一、延迟消息的核心机制 RocketMQ(5.0之前) 不支持任意时间精度的延迟,而是通过预定义的 延迟级别(Delay Level&a…...
基于SpringBoot的校园二手交易平台(源码+论文+部署教程)
运行环境 校园二手交易平台运行环境如下: • 前端:Vue • 后端:Java • IDE工具:IntelliJ IDEA(可自行更换) • 技术栈:SpringBoot Vue MySQL 主要功能 校园二手交易平台主要包含前台和…...
如何快速写出国内外现状的内容并且引用对应的参考文献(近三年的论文)
解决方法: 1.首先从知网或者谷歌学术中搜索相关关键字的论文根据时间排列(最新的在前面)。然后多选选中自己想要引用的论文(一般近三年的论文要占2/3),然后导出参考文献 [19] Lu L, Jin P, Karniadakis G E. DeepONet: Learning nonlinear operators for identifying dif…...
SQL的select语句完整的执行顺序
SQL的SELECT语句的执行顺序可以用"做菜流程"来类比理解。虽然我们写SQL时按SELECT…FROM…WHERE…顺序写,但数据库执行顺序完全不同。以下是通俗易懂的讲解(附流程图和示例): 🔧 执行顺序流程图:…...
开源操作系统纷争:CentOS停服后的新战场
开源操作系统纷争:CentOS停服后的新战场 引言 2020年12月,Red Hat宣布将停止维护CentOS Linux,转而专注于CentOS Stream。这一决策在开源社区掀起轩然大波,尤其是那些依赖CentOS作为生产环境操作系统的企业和开发者们࿰…...
【知识】torchrun 与 torch.multiprocessing.spawn 的对比
转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 来自ChatGPT、DeepSeek 有点干,可仅做了解。 torchrun 和 torch.multiprocessing.spawn 都是在 PyTorch 中用于并行化和分布式训练的工具&a…...
利用 LangChain 和一个大语言模型(LLM)构建一个链条,自动从用户输入的问题中提取相关的 SQL 表信息,再生成对应的 SQL 查询
示例代码: from langchain_core.runnables import RunnablePassthrough from langchain.chains import create_sql_query_chain from operator import itemgetter from langchain.chains.openai_tools import create_extraction_chain_pydantic# 系统消息ÿ…...
力扣hot 100之矩阵四题解法总结
本期总结hot100 中二维矩阵的题,时空复杂度就不分析了 1.矩阵置零 原地标记,用第一行和第一列作为当前行列是否为0的标记,同时用两个标签分别记录0行、0列的标记空间中原本是否有0 class Solution:def setZeroes(self, matrix: List[List[…...
使用python运行网格世界环境下 TD算法
一、概述 本代码实现了在网格世界环境中使用 TD (0)(Temporal Difference (0))算法进行策略评估,并对评估结果进行可视化展示。通过模拟智能体在网格世界中的移动,不断更新状态值函数,最终得到每个状态的价值估计。 二…...
在Linux上使用APT安装Sniffnet的详细步骤
一、引言 Sniffnet 是一款开源的网络流量监控工具,适用于多种Linux发行版。如果你的Linux系统使用APT(Advanced Package Tool)作为包管理器,以下是如何通过APT安装Sniffnet的详细步骤。 二、系统要求 在开始安装之前࿰…...
zookeeper-docker版
Zookeeper-docker版 1 zookeeper概述 1.1 什么是zookeeper Zookeeper是一个分布式的、高性能的、开源的分布式系统的协调(Coordination)服务,它是一个为分布式应用提供一致性服务的软件。 1.2 zookeeper应用场景 zookeeper是一个经典的分…...
StableDiffusion本地部署 3 整合包猜想
本地部署和整合包制作猜测 文章目录 本地部署和整合包制作猜测官方部署第一种第二种 StabilityMatrix下载整合包制作流程猜测 写了这么多python打包和本地部署的文章,目的是向做一个小整合包出来,不要求有图形界面,只是希望一键就能运行。 但…...
数据结构(初阶)(七)----树和二叉树(前中后序遍历)
实现链式结构的二叉树 实现链式结构的二叉树遍历前序遍历中序遍历后序遍历 节点个数叶子节点个数⼆叉树第k层结点个数⼆叉树的深度/⾼度查找值为X的节点二叉树的销毁 层序遍历判断二叉树是否为完全二叉树 ⽤链表来表⽰⼀棵⼆叉树,即⽤链来指⽰元素的逻辑关系。 通常…...
SOME/IP 教程知识点总结
总结关于SOME/IP的教程,首先通读整个文件,理解各个部分的内容。看起来这个教程从介绍开始,讲到了为什么在车辆中使用以太网,然后详细讲解了SOME/IP的概念、序列化、消息传递、服务发现(SOME/IP-SD)、发布/订阅机制以及支持情况。 首先,我需要确认每个章节的主要知识点。…...
安装 Windows Docker Desktop - WSL问题
一、关联文章: 1、Docker Desktop 安装使用教程 2、家庭版 Windows 安装 Docker 没有 Hyper-V 问题 3、打开 Windows Docker Desktop 出现 Docker Engine Stopped 问题 二、问题解析 打开 Docker Desktop 出现问题,如下: Docker Desktop - WSL update failed An error o…...
科技赋能筑未来 中建海龙MiC建筑技术打造保障房建设新标杆
近日,深圳梅林路6号保障房项目顺利封顶,标志着国内装配式建筑领域又一里程碑式突破。中建海龙科技有限公司(以下简称“中建海龙”)以模块化集成建筑(MiC)技术为核心,通过科技创新与工业化建造深…...
json介绍、python数据和json数据的相互转换
目录 一 json介绍 json是什么? 用处 Json 和 XML 对比 各语言对Json的支持情况 Json规范详解 二 python数据和json数据的相互转换 dumps() : 转换成json loads(): 转换成python数据 总结 一 json介绍 json是什么? 实质上是一条字符串 是一种…...
关于学习一门新的编程语言的策略
实践 实践 实践 那么如何实践呢 ,very easy,测验 测验 测验 测验 测验 测验 测验 测验 测验 测验 测验 测验 测验 测验 测验 测验 测验 测验 测验 测验 测验 测验 测验 测验 测验 测验 测验 测验 测验 测验 测验 测验 测验 测验 测验 测验 测验 测验 测…...
Rust 是什么
Rust 是什么 Rust 是一种由 Mozilla 开发的系统级编程语言,它于 2010 年首次亮相,在 2015 年发布 1.0 版本,此后迅速发展并受到广泛关注。 内存安全:Rust 最大的亮点之一是它在编译阶段就能够避免常见的内存错误,如空指针引用、数据竞争和内存泄漏等。它通过所有权(Owne…...
C#开发——时间间隔类TimSpan
TimeSpan 是 C# 中的一个结构( struct ),用于表示时间间隔或持续时间。它位于 System 命名空间中,是处理时间相关操作时非常重要的工具,尤其是在计算两个日期或时间之间的差值、表示时间段或执行时间相关的运算…...
计算机毕设JAVA——某高校宿舍管理系统(基于SpringBoot+Vue前后端分离的项目)
文章目录 概要项目演示图片系统架构技术运行环境系统功能简介 概要 网络上许多计算机毕设项目开发前端界面设计复杂、不美观,而且功能结构十分单一,存在很多雷同的项目:不同的项目基本上就是套用固定模板,换个颜色、改个文字&…...
[随手笔记]C#保留小数防止四舍五入有效解决办法
private decimal 截断小数(decimal 原小数值, int 保留小数个数) { string 原小数转字符串值 原小数值.ToString(); try { if (原小数转字符串值.Contains(".")) { int 原小数总长度 原小数转字符串值.Length; …...
C++ 二叉树代码
二叉树代码,见下 #include <iostream> using namespace std;template<typename T> struct TreeNode{T val;TreeNode *left;TreeNode *right;TreeNode():val(0), left(NULL), right(NULL)TreeNode(T x):val(x), left(NULL), right(NULL){} };template&l…...
Spring Boot 测试:单元、集成与契约测试全解析
一、Spring Boot 分层测试策略 Spring Boot 应用采用经典的分层架构,不同层级的功能模块对应不同的测试策略,以确保代码质量和系统稳定性。 Spring Boot 分层架构: Spring Boot分层架构 A[客户端] -->|HTTP 请求| B[Controller 层] …...
Oracle 数据库基础入门(四):分组与联表查询的深度探索(上)
在 Oracle 数据库的学习进程中,分组查询与联表查询是进阶阶段的重要知识点,它们如同数据库操作的魔法棒,能够从复杂的数据中挖掘出有价值的信息。对于 Java 全栈开发者而言,掌握这些技能不仅有助于高效地处理数据库数据࿰…...
机器学习的起点:线性回归Linear Regression
机器学习的起点:线性回归Linear Regression 作为机器学习的起点,线性回归是理解算法逻辑的绝佳入口。我们从定义、评估方法、应用场景到局限性,用生活化的案例和数学直觉为你构建知识框架。 回归算法 一、线性回归的定义与核心原理 定义&a…...
2024贵州大学计算机考研复试上机真题
历年贵州大学计算机考研复试上机真题 2024贵州大学计算机考研复试上机真题 2023贵州大学计算机考研复试上机真题 贵州大学计算机考研复试上机真题 在线 oj 测评:https://app2098.acapp.acwing.com.cn/problem/list/ 字符串翻转 题目描述 给定一个字符串…...
17、什么是智能指针,C++有哪几种智能指针【高频】
智能指针其实不是指针,而是一个(模板)类,用来存储指向某块资源的指针,并自动释放这块资源,从而解决内存泄漏问题。主要有以下四种: auto_ptr 它的思想就是当当一个指针对象赋值给另一个指针对…...
PyCharm接入本地部署DeepSeek 实现AI编程!【支持windows与linux】
今天尝试在pycharm上接入了本地部署的deepseek,实现了AI编程,体验还是很棒的。下面详细叙述整个安装过程。 本次搭建的框架组合是 DeepSeek-r1:1.5b/7b Pycharm专业版或者社区版 Proxy AI(CodeGPT) 首先了解不同版本的deepsee…...
深入解析SQL Server高级SQL技巧
SQL Server 是一种功能强大的关系型数据库管理系统,广泛应用于各种数据驱动的应用程序中。在开发过程中,掌握一些高级SQL技巧,不仅能提高查询性能,还能优化开发效率。这篇文章将全面深入地探讨SQL Server中的一些高级技巧…...
