转发 IndexFile 文件|学习笔记

简介: 快速学习转发 IndexFile 文件

开发者学堂课程【RocketMQ 知识精讲与项目实战(第三阶段)转发 IndexFile 文件】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/704/detail/12485


转发 IndexFile 文件


转发到 Index 索引文件的过程。

回到 doDispatch 方法当中。

public void doDispatch(DispatchRequest req) {

for(CommitLogDispatcher dispatcher:this.dispatcherList){

dispatcher.dispatch(req);

}

}

然后点击 dispatch 查看 CommitLogDispatcherBuildIndex 接口的实现类。

public void doDispatch(DispatchRequest req) {

for(CommitLogDispatcher dispatcher:this.dispatcherList){

dispatcher.dispatch(req);

}

}

image.png点击进入,会发现调用了 buildIndex 方法。

defaultMessageStore.this.indexService.buildIndex(request);

进入这个方法中,第一步拿到了 IndexFile 索引文件,然后获得索引文件最大的偏移量,目的是做一个判断,如果消息的偏移量小于物理文件的最大偏移量 endPhyOffset ,那说明当前的消息存在重复消息,那么直接返回。

IndexFile indexFile = retryGetAndCreateIndexFile();

if(indexFile != null){

Long endPhyOffset = indexFile.getEndPhyOffset();

DispatchRequest msg = req;

String topic = msg.getTopic();

String keys = msg.getKeys();

if(msg.getCommitLogOffset() < endPhyOffset){

return;

}

}

如果当前不存在重复消息,就会根据消息的 ID 去构建索引,然后通过 key 给它构建到索引文件 indexFile 中。先构建 key ,将 key 构建到 indexFile 中。这就是整个索引文件构建的过程。

if(req.getUniqKey() != null){

indexFile= putKey(indexFile,msg,buildKey(topic,req,getUniqKey)));

if(indexFile == null){

Log.error(“putKey error commitlog {} uniqkey {}”,req.getCommitLogOffset(),req.getUniqKey)

return;

}

}

回顾

image.png转发 Index ,入口在 buildIndex 。

class CommitLogDispatcherBuildIndex implements CommitLogDispatcher {

@Override

public void dispatch(DispatchRequest request) {

if (DefaultMessageStore.this.messageStoreconfig.isMessageIndexEnable()) {

DefaultMessagestore.this.indexService.buildIndex(request);

}

}

}

在 bulidIndex 中做了几件重要的事,第一个是拿到索引文件。第二个是判断索引文件当中的物理偏移量如果大于消息的偏移量,说明当前的消息是重复的消息,直接返回。如果消息是正常的,根据消息去构建一个唯一的索引 key ,然后将 key 写入 indexFile 中。

IndexFile indexFile = retryGetAndCreateIndexFile();

if(indexFile != null){

Long endPhyOffset = indexFile.getEndPhyOffset();

DispatchRequest msg = req;

String topic = msg.getTopic();

String keys = msg.getKeys();

if(msg.getCommitLogOffset() < endPhyOffset){

return;

}

}

if(req.getUniqKey() != null){

indexFile= putKey(indexFile,msg,buildKey(topic,req,getUniqKey)));

if(indexFile == null){

Log.error(“putKeyerrorcommitlog{}uniqkey {}”,req.getCommitLogOffset(),req.getUniqKey)

return;

}

}

以上是转发到Index的流程。

相关文章
|
自然语言处理 搜索推荐 开发者
SmartArXiv——基于OpenSearch LLM智能问答版构建的智能学术论文助手正式发布
本文介绍智能学术论文助手SmartArxiv的架构、应用场景和产品功能。
2390 1
|
监控 Unix Linux
Linux命令行教程:使用head和tail命令快速查看文件的开头和结尾
Linux命令行教程:使用head和tail命令快速查看文件的开头和结尾
755 1
|
机器学习/深度学习 人工智能 数据挖掘
AlexNet架构解析
AlexNet是2012年ImageNet图像分类竞赛的冠军,首次将卷积神经网络CNN和深度学习用于大规模图像分类并且性能优异,在今天也具有一定的参考价值。
943 0
AlexNet架构解析
|
5月前
|
IDE 开发工具 双11
鸿蒙5开发宝藏案例分享---一多开发实例(长视频)
这篇文章深入解析了鸿蒙开发中的宝藏案例,特别是长视频应用的“一多开发”实例。它通过动态栅格布局、折叠屏优化和ArkUI响应式设计等技术,实现了手机、平板、PC等多种设备的一次开发适配。文中还提供了电商、新闻类应用的实际案例及代码解析,并总结了多端开发常见问题的避坑指南,如图片变形、交互冲突等解决方案。最后分享学习捷径,包括IDE模板、调试工具和官方社区资源,帮助开发者轻松掌握鸿蒙多设备开发技巧。
|
存储 机器学习/深度学习 分布式计算
HDFS NameNode元数据管理
HDFS NameNode元数据管理
|
安全 Shell API
技术心得记录:恶意代码功能与应对
技术心得记录:恶意代码功能与应对
238 0
|
设计模式 网络协议 算法
《跟闪电侠学Netty》阅读笔记 - Netty入门程序解析(一)
《跟闪电侠学Netty》阅读笔记 - Netty入门程序解析(一)
365 1
《跟闪电侠学Netty》阅读笔记 - Netty入门程序解析(一)
|
Java
Java中如何定义一个线程工厂?
在Java中,线程工厂(ThreadFactory)用于自定义线程的创建,通过实现ThreadFactory接口可定义线程的属性和命名规则。示例代码展示了如何创建一个自定义线程工厂,如设置线程名称和优先级。使用时,通过线程工厂的`newThread()`方法创建并启动线程,便于统一管理和配置线程,满足特定需求。
283 0
|
机器学习/深度学习 算法 计算机视觉
【计算机视觉】图像分割中FCN、DeepLab、SegNet、U-Net、Mask R-CNN等算法的讲解(图文解释 超详细)
【计算机视觉】图像分割中FCN、DeepLab、SegNet、U-Net、Mask R-CNN等算法的讲解(图文解释 超详细)
1071 0
|
测试技术 项目管理 数据库
【软件设计师备考 专题 】软件生存期模型:瀑布、螺旋与喷泉
【软件设计师备考 专题 】软件生存期模型:瀑布、螺旋与喷泉
413 0