rocketmq源码-consumerQueue和indexFile文件写入

news2025/1/19 14:25:40

前言

在rocketmq的文件中,除了commitLog文件,还有两个重要的文件,分别是indexFile文件和consumerQueue文件,这篇笔记主要记录这两个文件的数据是怎么写进去的
consumeQueue文件中对应topic下的一个queue,在consumeQueue文件中,存放了三部分数据:分别是当前消息在commitLog中的offset、以及消息的大小、tagCode信息
在这里插入图片描述

indexFile文件暂时没有看懂细节,只是从官网和网上的博客来看,在根据key进行快速查找msg信息时,会用到indexFile文件,关于indexFile文件的细节,暂时先空着,后面学习了之后,再补充

入口

在前面broker启动的那篇博客中,有讲到过,在启动过程中,有一个service,是用来同步这两个文件的,我们从这里开始看起

/**
 * setReputFromOffset:是设置当前要从哪里开始同步消息信息到indexFile和consumerQueue文件
 * 启动reputMessageService,更新consumerQueue文件
 * 这里启动的异步线程,是为了监听commitLog文件,然后根据文件中写入的数据,更新consumerQueue和indexFiLe
 */
this.reputMessageService.setReputFromOffset(maxPhysicalPosInLogicQueue);
this.reputMessageService.start();

可以看到,这里会每隔1ms,就去尝试执行一次doReput()方法
在这里插入图片描述

执行

在这个逻辑中,分为了几个比较重要的逻辑
1、判断当前开始同步的位置是否正确
2、for循环,开始同步commitLog中的消息
3、尝试从commitLog中指定的位置开始获取数据
4、开始处理消息,进行同步,这个逻辑在getData下面的if逻辑中,因为代码太长,就先暂时折叠起来了
在这里插入图片描述

从指定offset获取消息

commitLog.getData()

拉取消息的逻辑,这里看起来,就是根据offset,从mappedFile中获取数据;这里在调用mappedFile.selectMappedBuffer()方法的时候,方法内部会获取到一个endPos, 这里入参的pos 是开启位置的pos;endPos是如何获取的,暂时没有细看;总之这个方法执行之后,会获取到要同步的消息信息
在这里插入图片描述

处理消息

这里就是上面我说的先暂时折叠起来的if逻辑

这里大致有三个步骤

  1. 构建dispatchRequest对象
  2. 调用doDispatch()方法进行消息分发,真正同步到consumeQueue和indexFile,就是在这个方法中处理的
  3. 更新offset

在这里插入图片描述
在这里插入图片描述

consumeQueue

org.apache.rocketmq.store.DefaultMessageStore.CommitLogDispatcherBuildConsumeQueue#dispatch

在这里插入图片描述
在这里插入图片描述

这里可以看到,在准备往consumeQueue中写 数据的时候,只有几个字段

  1. commitLogOffset
  2. msgSize
  3. tagsCode:这个需要注意下,对于延迟消息,tagCode存放的是消息的到期时间
  4. consumeQueueOffset

在这里插入图片描述
在这里,会把要写入到consumeQueue中的数据,先写入到byteBuffer中
在这里插入图片描述

接着会调用appendMessage方法,在这个方法中,就是通过fileChannel.write()把数据写入到文件中
在这里插入图片描述

indexFile

org.apache.rocketmq.store.DefaultMessageStore.CommitLogDispatcherBuildIndex#dispatch

indexFile这里暂时先缺失吧,这里看了下,确实没有太看得懂,只看到里面会调用putKey(),类似于hashmap这种方式,然后内部又是写byteBuffer,又是写indexHeader, 这些等先学习下相关的理论知识 再看下源码

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

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

相关文章

ubuntu22.04安装kalibr

前言 首先ros1目前目前在ubuntu支持的最高版本是20.04。当时我是在ubuntu22.04上编译安装的ros1。过程也十分坎坷,手动下载了很多包,具体就不累赘了。 再者目前网上的资料也都是kalibrros1, 所以推荐安装ros1之后再来安装kalibr。其次这次安装主要 参考…

关于splitChunks的一次原理探索

前言 前端时间在做项目加载优化时用到了splitChunks自动拆包,后了解了一下原理写下了此文。 Modules和Chunks Modules简单来理解就是我们写的功能模块,不管是CommonJS还是ESM都算是一个Module,而Chunks则是webpack根据我们的规则/默认规则…

spring security 前后端分离 进行用户验证 权限登陆的实现代码(看不懂??直接cv)

目录 前言: 一.所需依赖 二.application.properties 三.工具类 3.1ApplicationContextUtils 3.2JwtUtils 3.3ResponseResult 3.4ResponseStatus 3.5RsaUtils 四.UserDetailServiceImpl 五.成功处理器 六.SecurityConfig 七. filter 前言: 前后…

多个路由器的局域网终端设备的资源访问

多个路由器之间资源的访问 本质是将路由设备放置到一个网段 中继路由 中继的路由可以看作是另一个路由中的一个终端设备,只是为了延长传递wifi,在使用ipcofig中的网关和主路由的网关一样,一般都是主路由的IP。 无线桥接的中继路由 无论是…

车-电-路网时空分布负荷预测研究(Matlab代码)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

使用c语言连接mysql数据库并且批量插入数据

​ 使用从c连接数据库需要在本机安装数据库,或者拿到数据库所在主机的IP地址。先说明我使用的是mysql8.0 64位的数据库,使用的vs是vs2019。 1.配置环境 首先打开vs2019,创建一个空项目,让后右击下图所示位置,然…

网络编程套接字之UDP

文章目录一、网络编程二、UDP数据报套接字编程DatagramSocketDatagramPacket实现客户端服务器程序EchoServer客户端一、网络编程 我们网络编程的核心: Socket API,操作系统为我们应用程序提供的API,我们的Socket是和传输层密切相关的。 我们传输层为我…

SpringBoot+Vue+Wx健康上报系统

简介:本项目采用了基本的springbootvueWx设计健康上报系统。详情请看截图。经测试,本项目正常运行。本项目适用于Java毕业设计、课程设计学习参考等用途。 项目描述 项目名称SpringBootVueWx健康上报系统源码作者LHL项目类型Java EE项目 (前…

多线程初阶——线程状态

多线程初阶——线程状态 文章目录多线程初阶——线程状态1.Thread类及常见构造方法2.Thread常见的方法3.线程相关的重要操作3.1启动线程—start()3.2中断线程3.3 等待线程— join()3.4 获取线程引用3.5休眠线程—sleep()4.线程的状态1.Thread类及常见构造方法 方法说明Thread(…

前端js实现根据文件url批量压缩下载成zip包

前言 项目开发中,产品经理提了这样一个需求:将系统中的附件实现批量打包下载功能。本来系统中是有单个下载及批量下载功能,现在应业务方的需求,需要多加个批量打包下载。 初步设想是:由后端编写接口实现。但后来经过思…

从事测试开发8年,聊聊我是怎么从0基础到年薪40万的

本人从事测试开发8年多,之前在猪场工作,年薪突破40W,算是一个生活过得去的码农。(仅代表本人)目前从事软件测试行业的薪资待遇还是很不错的,所以如果朋友们真的对软件测试感兴趣的话可以坚持学下去&#xf…

Java native agent学习笔记-从加载到log4j漏洞检测

记录一下java native agent的学习过程,也顺便造一个检测log4j漏洞的轮子: java native agent相比java agent最大的好处是快,C写的,快的一笔,但是最大的坏处是非常麻烦,毕竟你拿个面过程的语言怼面对象的肯定是比较麻烦的。 本次学习的目的是做个加载器,动态加载agent,然后再实…

研究人员发布 VMware vRealize Log RCE 漏洞,立即打补丁

Horizon3 攻击团队的安全研究人员将于下周发布一个针对漏洞链的漏洞利用程序,以在未打补丁的 VMware vRealize Log Insight 设备上获得远程代码执行。 vRealize Log Insight 现在称为 VMware Aria Operations for Logs,它使 VMware 管理员可以更轻松地分…

每日学术速递2.4

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.LG、cs.AI 1.Neuro Symbolic Continual Learning: Knowledge, Reasoning Shortcuts and Concept Rehearsal 标题:神经象征性的持续学习:知识、推理捷径和概念排练…

必须掌握的网络安全知识

没有网络安全,就没有国家安全。网络安全和保密防护,是机关单位日常工作中不可忽视的重要问题。尤其在涉密单位工作的人员,因工作性质特殊,不仅要了解非涉密网络的安全操作常识,更要重点了解涉密网络的规范行为要点&…

2021年上半年信息系统项目管理师真题与答案完整版(综合知识、案例分析、论文)

1、 国家信息化体系包括六个要素,其中()是信息化体系六要素中的龙头,是国家信息化建设的主阵地,集中体现了国家信息化建设的需求和效益。A、信息资源 B、信息技术应用 C、信息网络 D、信息化政策法规和标准规范0参考答…

若依代码生成器------数据库篇

继上一篇《若依代码自动生成器研究-表查询篇》,我们继续来学习若依系统中的代码生成逻辑。 导入表之Sql查询 在菜单栏点击“代码生成”,在右侧栏中点击“导入”按钮,在文章若依中的代码自动生成器研究-表查询篇中,我们已经一直…

三十六、Kubernetes1.25中数据存储第一篇

1、概述在前面已经提到,容器的生命周期可能很短,会被频繁地创建和销毁。那么容器在销毁时,保存在容器中的数据也会被清除。这种结果对用户来说,在某些情况下是不乐意看到的。为了持久化保存容器的数据,kubernetes引入了…

【深度学习】对SSD与Retina的理解

SSD 正负样本选择 同YOLO 选择与GT IOU最大的anchor作为正样本。(此时正负样本很不平衡)对于剩余未匹配anchor,将与GT IOU超过0.5的作为正样本。这样一个GT就可以匹配多个anchor,增加正样本的数量。(此时负样本依然多于正样本)hard negative mining,难负样本挖掘。将所有…

重定向的概述和使用(基于web方面),很简单

大家好,今天分享一下重定向的概述以及使用 我们要知道,重定向(Redirect)就是通过各种方法将各种网络请求重新定个方向转到其它位置 同时,重定向有好几类 1.网页重定向、 2.域名的重定向、 3.路由选择 4. Linux上的文件重定向操作 就是要知…