转发 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月前
|
网络架构
路由转发(详细理解+实例精讲)
本文详细的介绍路由转发,内含详细的实例解析,该文你值得拥有。
|
11月前
|
C++
C++ 完美转发
C++ 完美转发
45 0
SpringCloudGateway手动编写路由规则对请求进行转发
SpringCloudGateway手动编写路由规则对请求进行转发 这篇文章主要是提供一种转发路由的代码实现方式,之前说的gateway都是使用配置文件来对请求进行路由,这样虽然很简单,但是不够灵活,如果后端对应很多服务实例,网关想要根据自己的规则来转发请求,比如编写不同的负载均衡策略,做一些特别的权重,以及在运行过程中动态的变更转发地址,这些用配置文件来做都不够灵活,没法自由的定义规则。
|
前端开发
Nuxt 配置端口和代理转发记录备忘
将新的项目的url,固定带上项目名,这里先记录一下,后面有时间再仔细研究
348 0
|
消息中间件 RocketMQ 开发者
转发数据到 ConsumerQueue 文件|学习笔记
快速学习转发数据到 ConsumerQueue 文件
69 0
转发数据到 ConsumerQueue 文件|学习笔记
|
前端开发 数据库
转发和重定向的区别及使用方法(全)
目录前言1. 定义1.1 转发1.2 重定向2. springmvc实战代码3. 总结异同 前言 页面跳转的主要两种实现方式: 转发 重定向 1. 定义 1.1 转发 在客户端中发送请求到服务端,在服务端中有所匹配的servlet即可,之后servlet执行其操作,之后调用getRequestDispacther()方法,把请求转发给指定的前端页面,整个流程都是在服务端中执行(同一个请求)。在转发过程中,可以把数据保存到request域对象中(因为转发使用同一个request域) request.get
288 0
|
网络协议 物联网
DFP 数据转发协议应用实例
稳控科技编写的一套数据转发规则, 取自“自由转发协议 FFP(Free Forward Protocol)” ,或者 DFP(DoubleF Protocol), DF 也可以理解为 Datas Forward(数据转发)的缩写。DF 协议是与硬件接口无关的数据链路层协议,规定了数据流如何在不同设备之间、不同接口之间的传输方向。 DF 协议一般用于延长数字接口的传输距离(数据中继),它与硬件接口类型无关,可以基于 UART、 LoRA、TCP 等异步数据传输介质。
DFP 数据转发协议应用实例
|
数据库
转发和重定向的区别以及适用范围
一:请求转发是指,服务器收到请求后,从一次资源跳转到另一个资源的操作。 1.请求转发(forward)的特点: (1)浏览器的地址栏不会发生变化 (2)一次请求,服务器完成转发操作 (3)共享request域中的数据 (4)可以转发到WEB-INF目录下 (5)转发只能访问当前服务器下的资源
|
缓存 负载均衡 Java