转发 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的流程。

相关文章
|
机器学习/深度学习 人工智能 数据挖掘
AlexNet架构解析
AlexNet是2012年ImageNet图像分类竞赛的冠军,首次将卷积神经网络CNN和深度学习用于大规模图像分类并且性能优异,在今天也具有一定的参考价值。
881 0
AlexNet架构解析
|
存储 机器学习/深度学习 分布式计算
HDFS NameNode元数据管理
HDFS NameNode元数据管理
|
安全 Shell API
技术心得记录:恶意代码功能与应对
技术心得记录:恶意代码功能与应对
195 0
|
设计模式 网络协议 算法
《跟闪电侠学Netty》阅读笔记 - Netty入门程序解析(一)
《跟闪电侠学Netty》阅读笔记 - Netty入门程序解析(一)
335 1
《跟闪电侠学Netty》阅读笔记 - Netty入门程序解析(一)
|
缓存 安全 NoSQL
SpringSecurity实现前后端分离登录token认证详解
SpringSecurity实现前后端分离登录token认证详解
954 1
|
存储 安全 前端开发
OSS对象存储,网页版上传文件操作,傻瓜看图有手就行!
OSS对象存储,网页版上传文件操作,傻瓜看图有手就行!
753 1
OSS对象存储,网页版上传文件操作,傻瓜看图有手就行!
|
前端开发
图标库的正确使用方式
今天来教大家在实际开发中引入图标库
826 2
图标库的正确使用方式
|
Linux 数据安全/隐私保护 网络协议
Python三大控制结构:顺序结构、分支结构、循环结构
Python三大控制结构:顺序结构、分支结构、循环结构(for、while)