Java小案例-RocketMQ的11种消息类型,你知道几种?(延迟消息)

前言

上一节给大家讲了Rocket的顺序消息,这一节和大家聊一下延迟消息,关于顺序消息大家可以点下面这个链接直接看

RocketMQ的延迟消息

延迟消息

延迟消息就是指生产者发送消息之后,消息不会立马被消费,而是等待一定的时间之后再被消息

RocketMQ的延迟消息用起来非常简单,只需要在创建消息的时候指定延迟级别,之后这条消息就成为延迟消息了

Message message = new Message("sanyouTopic", "java日记 0".getBytes());
//延迟级别
message.setDelayTimeLevel(1);

虽然用起来简单,但是背后的实现原理还是有点意思,我们接着往下看

RocketMQ延迟消息的延迟时间默认有18个级别,不同的延迟级别对应的延迟时间不同

RocketMQ内部有一个Topic,专门用来表示是延迟消息的,叫SCHEDULE_TOPIC_XXXX,XXXX不是占位符,就是XXXX

RocketMQ会根据延迟级别的个数为SCHEDULE_TOPIC_XXXX这个Topic创建相对应数量的队列

比如默认延迟级别是18,那么SCHEDULE_TOPIC_XXXX就有18个队列,队列的id从0开始,所以延迟级别为1时,对应的队列id就是0,为2时对应的就是1,依次类推

SCHEDULE_TOPIC_XXXX这个Topic有什么作用呢?

这就得从消息存储时的一波偷梁换柱的骚操作了说起了

当服务端接收到消息的时候,判断延迟级别大于0的时候,说明是延迟消息,此时会干下面三件事:

  • 将消息的Topic改成SCHEDULE_TOPIC_XXXX

  • 将消息的队列id设置为延迟级别对应的队列id

  • 将消息真正的Topic和队列id存到前面提到的消息存储时的额外信息中

之后消息就按照正常存储的步骤存到CommitLog文件中

由于消息存到的是SCHEDULE_TOPIC_XXXX这个Topic中,而不是消息真正的目标Topic中,所以消费者此时是消费不到消息的

举个例子,比如有条消息,Topic为sanyou,所在的队列id = 1,延迟级别 = 1,那么偷梁换柱之后的结果如下图所示

代码如下

所以从上分析可以得出一个结论

所有RocketMQ的延迟消息,最终都会存储到SCHEDULE_TOPIC_XXXX这个Topic中,并且同一个延迟级别的消息在同一个队列中

在存消息偷梁换柱之后,实现延迟消费的最关键的一个步骤来了

BocketMQ在启动的时候,除了为每个延迟级别创建一个队列之后,还会为每个延迟级别创建一个延迟任务,也就相当于一个定时任务,每隔100ms执行一次

这个延迟任务会去检查这个队列中的消息有没有到达延迟时间,也就是不是可以消费了

前面的结论,每个队列都有一个ConsumeQueue文件,可以通过ConsumeQueue找到这个队列中的消息

一旦发现到达延迟时间,可以消费了,此时就会从这条消息额外存储的消息中拿到真正的Topic和队列id,重新构建一条新的消息,将新的消息的Topic和队列id设置成真正的Topic和队列id,内容还是原来消息的内容

之后再一次将新构建的消息存储到CommitLog中

由于新消息的Topic变成消息真正的Topic了,所以之后消费者就能够消费到这条消息了

所以,从整体来说,RocketMQ延迟消息的实现本质上就是最开始消息是存在SCHEDULE_TOPIC_XXXX这个中转的Topic中

然后会有一个类似定时任务的东西,不停地去找到这个Topic中的消息

一旦发现这个消息达到了延迟任务,说明可以消费了,那么就重新构建一条消息,这条消息的Topic和队列id都是实际上的Topic和队列id,然后存到CommitLog

之后消费者就能够在目标的Topic获取到消息了

总结

RocketMQ的延迟消息是一种特殊的消息类型,当消息写入到Broker后,不能立刻被消费者消费,需要等待指定的时长后才可被消费处理。这种消息的延迟时长不支持随意时长的延迟,是通过特定的延迟等级来指定的。RocketMQ默认支持18个等级的延迟消息,延时等级定义在RocketMQ服务端的MessageStoreConfig类中的特定变量中。

在实际应用中,不使用定时器,利用RocketMQ的延迟消息可以实现定时任务的功能,适用于一些特定的场景,如电商交易系统的订单超时未支付自动取消订单等。

其实现原理主要是消息在RocketMQ Broker端的流转过程中,对延迟消息进行特殊处理,计算这条延迟消息需要在什么时候进行投递。投递时间等于消息存储时间加上延迟级别对应的时间。

联系方式

关于文章中大家有任何疑问可以通过关注公众号《编程乐学》进行留言,同时,公众号还有更多有趣的项目以及关于学习编程的笔记资料大家可以看看,欢迎大家进行留言。

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

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

相关文章

计算机硬件 3.3其他存储设备

第三节 其他存储设备 一、固态硬盘(SSD) 1.优点:读写速度快、防震抗摔、低功耗、无噪声、轻便。 2.缺点:容量小、寿命限制、售价高。 3.接口:SATA3、M.2、Type-C、mSATA等。 4.分类:盒装式、插卡式。 二…

十五 动手学深度学习v2计算机视觉 ——全连接神经网络FCN

文章目录 FCN FCN 全卷积网络先使用卷积神经网络抽取图像特征,然后通过卷积层将通道数变换为类别个数,最后通过转置卷积层将特征图的高和宽变换为输入图像的尺寸。 因此,模型输出与输入图像的高和宽相同,且最终输出通道包含了该空…

海思平台isp之ccm标定

文章目录 1、raw图采集2、ccm标定2.1、标定参数配置2.2、标定效果优化2.2.1、优化方式一2.2.2、优化方式二2.2.3、优化方式三1、raw图采集 raw图采集步骤及标准,请参考文章 《海思平台isp之ccm标定》。2、ccm标定 2.1、标定参数配置 (1)图像基本参数 (2)黑电平设置 (…

Spring-MVC-文件上传下载

依赖 <dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.3</version> </dependency> <dependency><groupId>javax.servlet</groupId><artif…

mac视频调色 DaVinci Resolve Studio 18 中文 for Mac

DaVinci Resolve Studio 18是一款功能强大、专业可靠的视频编辑软件&#xff0c;适用于各种规模的媒体项目制作。无论是独立制片人还是大型制片公司&#xff0c;都可以借助该软件进行高质量的视频创作和后期制作。 得编辑工作更加高效和灵活。 调色和色彩校正&#xff1a;软件…

国外博士论文下载网址

系列文章目录 前言 如果你想补充其他相关网址&#xff0c;请留言 一、pqdtcn 1.1 使用说明 浏览本数据库建议使用chrome浏览器&#xff01; ProQuest检索平台在今年暑假做了界面升级。为了使您能更快了解升级后的界面功能&#xff0c;ProQuest公司准备了中文版用户使用手册…

【CSS】前端点点点加载小点样式css动画过程实现

对话的 ... 加载动画&#xff0c;直接用 CSS 就可以实现&#xff0c;样式可以自己改&#xff0c;逻辑大差不差 <div class"loading-text"><span class"dot1"></span><span class"dot2"></span><span class&quo…

RabbitMQ入门案例

RabbitMQ 是目前比较主流的MQ消息队列中间件&#xff0c;下面简单总结RabbitMQ入门时所做的一些笔记 1.RabbitMQ 入门案例 需求&#xff1a;用 Java 编写两个程序。发送单个消息的生产者和接收消息并打印出来的消费者 1.1 添加依赖 <!--rabbitmq 依赖客户端--> <de…

Java 线程创建的方法和原理

创建线程 方法一&#xff1a;Thread 类 创建Thread类的对象&#xff0c;重写其中的 run 方法&#xff1a; Slf4j(topic "c.Test1") public class d1_Thread {public static void main(String[] args) {// 创建 Thread 类的对象Thread t new Thread(){Overridepu…

SQL进阶理论篇(六):索引的使用原则

文章目录 简介什么时候创建索引&#xff1f;什么时候不需要创建索引索引在什么情况下会失效索引使用举例&#xff08;兴趣篇&#xff09;参考文献 简介 如何通过索引让查询效率最大化呢&#xff1f;本节主要考虑以下几个问题&#xff1a; 什么样的情况下需要创建索引&#xf…

C++中的reverse函数

1.实现反转数组。 //头文件 #include <algorithm> //使用方法 reverse(a, an);//n为数组中的元素个数 #include<cstdio> #include<iostream> #include<algorithm> using namespace std; int main() {int a[100];int n,k;cin >> n >> k; …

基于SpringBoot的停车位预约管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot的停车位预约管理系统,ja…

八大排序(插入排序 | 选择排序 | 冒泡排序)

在我们内存中我们一般会有一些没有顺序的数据&#xff0c;我们成为内排序&#xff0c;而今天分享八大排序的是时间复杂度为O&#xff08;N^2&#xff09;的插入排序&#xff0c;选择排序和教学意义比较强的冒泡排序。 插入排序 这是插入排序的动图&#xff0c;通过动图我们也…

PHP中如何处理文件上传?

在 PHP 中处理文件上传通常涉及到以下几个步骤&#xff1a; HTML 表单设置&#xff1a; 在 HTML 表单中设置 enctype 属性为 "multipart/form-data"&#xff0c;这是处理文件上传所必须的。 <form action"upload.php" method"post" enctype&q…

Python3 中常见的数据类型

目录 数字(Number)总结 字符串(String)字符串运算符字符串格式化字符串的截取总结 List&#xff08;列表&#xff09;更新列表删除列表元素列表函数&方法总结 Tuple&#xff08;元组&#xff09;修改元组删除元组总结 Set&#xff08;集合&#xff09;Dictionary&#xff0…

重新格式化字符串

说在前面 &#x1f388;不知道大家对于算法的学习是一个怎样的心态呢&#xff1f;为了面试还是因为兴趣&#xff1f;不管是出于什么原因&#xff0c;算法学习需要持续保持。 题目描述 给你一个混合了数字和字母的字符串 s&#xff0c;其中的字母均为小写英文字母。 请你将该字…

npm、yarn常用命令

1、设置npm路径 #全局安装路径 npm config set prefix "D:\Program Files\nodejs\node_global" #缓存路径 npm config set cache "D:\Program Files\nodejs\node_cache"2、设置镜像 #1,淘宝镜像源 npm config set registry https://registry.npmmirror.…

3D点云广义零样本分类的递归循环对比生成网络笔记

1 Title Contrastive Generative Network with Recursive-Loop for 3D point cloud generalized zero-shot classification(Yun Hao, Yukun Su, Guosheng Lin, Hanjing Su, Qingyao Wu)【Pattern Recognition】 2 Conclusion This work aims to facilitate research on 3D poi…

【Spring Boot】内网穿透实现远程调用调试

文章目录 1. 本地环境搭建1.1 环境参数1.2 搭建springboot服务项目 2. 内网穿透2.1 安装配置cpolar内网穿透2.1.1 windows系统2.1.2 linux系统 2.2 创建隧道映射本地端口2.3 测试公网地址 3. 固定公网地址3.1 保留一个二级子域名3.2 配置二级子域名3.2 测试使用固定公网地址 4.…

机器学习入门笔记

文章目录 背景具体步骤1.环境搭建2.写个demo1.数据处理2.分割数据集3.用模型训练数据&#xff0c;并得到预测结果4.绘制结果5.评估 背景 最近学习了一些关于机器学习的内容&#xff0c;做个笔记。 具体步骤 1.环境搭建 需要用到的工具&#xff1a;pycharm&#xff0c;anaco…