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

相关文章
|
网络协议 芯片
|
11天前
|
前端开发 搜索推荐 Java
网络基础重定向和转发的区别
本文介绍了网络基础中重定向和转发的区别。重定向是服务器告知客户端访问新URL,涉及两次请求,URL变化;转发是服务器内部处理,客户端无感知,URL不变。文中详细对比了两者的请求次数、数据传递及应用场景,并通过实例演示帮助理解。
|
2月前
|
JSON 文字识别 自然语言处理
转发文章
通过文档智能(Document Mind)解析文档支撑检索增强生成RAG 通过文档智能(Document Mind)将文档解析为结构化数据,结合语义理解,提取出文档层级树、样式信息以及版面信息,下游将解析的结果数据处理成文档切片,生成切块(Chunk)数据。 如图所示,文档智能支持将非结构化文档内容提取的信息输出为Markdown和Json格式,更方便构建语义分块策略。 解决问题:文档内容解析错误,相较于传统单页以电子解析文本或者OCR解析文本的方式,IDP则针对不同的文档类型,实现电子解析+OCR/NLP的细粒度混合版融合方案,通过电子解析+OCR/NLP中互相的优缺点弥补,提升解析的
47 4
|
4月前
|
Apache 数据安全/隐私保护
HAProxy的高级配置选项-ACL篇之基于源地址和子网子网匹配案例
这篇文章介绍了HAProxy的ACL(访问控制列表)功能,特别是如何基于源地址和子网进行匹配以实现流量分发的高级配置选项,并通过实战案例展示了配置过程和访问效果。
86 5
HAProxy的高级配置选项-ACL篇之基于源地址和子网子网匹配案例
|
5月前
|
网络虚拟化
无线基础知识:直接转发和隧道转发有何区别?
无线基础知识:直接转发和隧道转发有何区别?
485 4
|
6月前
|
前端开发 搜索推荐 Java
重定向和转发到底有啥区别?看这篇就够了!
在Web开发中,重定向和转发是常见操作,但它们有何不同?本文将详细解析重定向与转发的原理、区别及实际应用,帮助你在开发中更好地选择和使用这两种技术。
989 0
|
7月前
|
负载均衡 网络协议 算法
|
网络架构
路由转发(详细理解+实例精讲)
本文详细的介绍路由转发,内含详细的实例解析,该文你值得拥有。
|
C++
C++ 完美转发
C++ 完美转发
65 0
|
消息中间件 RocketMQ 开发者
转发数据到 ConsumerQueue 文件|学习笔记
快速学习转发数据到 ConsumerQueue 文件
转发数据到 ConsumerQueue 文件|学习笔记