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

相关文章
|
7月前
|
网络协议 网络虚拟化 网络架构
路由器入门快速配置
路由器入门快速配置
|
网络协议 芯片
|
27天前
|
JSON 文字识别 自然语言处理
转发文章
通过文档智能(Document Mind)解析文档支撑检索增强生成RAG 通过文档智能(Document Mind)将文档解析为结构化数据,结合语义理解,提取出文档层级树、样式信息以及版面信息,下游将解析的结果数据处理成文档切片,生成切块(Chunk)数据。 如图所示,文档智能支持将非结构化文档内容提取的信息输出为Markdown和Json格式,更方便构建语义分块策略。 解决问题:文档内容解析错误,相较于传统单页以电子解析文本或者OCR解析文本的方式,IDP则针对不同的文档类型,实现电子解析+OCR/NLP的细粒度混合版融合方案,通过电子解析+OCR/NLP中互相的优缺点弥补,提升解析的
34 4
|
网络架构
路由转发(详细理解+实例精讲)
本文详细的介绍路由转发,内含详细的实例解析,该文你值得拥有。
|
C++
C++ 完美转发
C++ 完美转发
57 0
SpringCloudGateway手动编写路由规则对请求进行转发
SpringCloudGateway手动编写路由规则对请求进行转发 这篇文章主要是提供一种转发路由的代码实现方式,之前说的gateway都是使用配置文件来对请求进行路由,这样虽然很简单,但是不够灵活,如果后端对应很多服务实例,网关想要根据自己的规则来转发请求,比如编写不同的负载均衡策略,做一些特别的权重,以及在运行过程中动态的变更转发地址,这些用配置文件来做都不够灵活,没法自由的定义规则。
|
消息中间件 RocketMQ 开发者
转发数据到 ConsumerQueue 文件|学习笔记
快速学习转发数据到 ConsumerQueue 文件
转发数据到 ConsumerQueue 文件|学习笔记
|
缓存 负载均衡 Java
|
前端开发 数据库
转发和重定向的区别及使用方法(全)
目录前言1. 定义1.1 转发1.2 重定向2. springmvc实战代码3. 总结异同 前言 页面跳转的主要两种实现方式: 转发 重定向 1. 定义 1.1 转发 在客户端中发送请求到服务端,在服务端中有所匹配的servlet即可,之后servlet执行其操作,之后调用getRequestDispacther()方法,把请求转发给指定的前端页面,整个流程都是在服务端中执行(同一个请求)。在转发过程中,可以把数据保存到request域对象中(因为转发使用同一个request域) request.get
423 0
转发与重定向有什么区别
转发与重定向有什么区别
118 0