从本文开始,笔者将尝试从源码角度解读Jafka(Kafka)的特性,探究其背后的实现原理与技术。前面讲解Jafka Broker的文章中有提到下面这段启动服务端的代码,我们就从这里开始。

Properties props = new Properties();

props.setProperty("port","9093");

props.setProperty("log.dir","/home/alfred/jafkaDataDirs/data1");

Jafka broker = new Jafka();

broker.start(props,null,null);

broker.awaitShutdown();

上面代码演示了Jafka一个broker的启动,其顺序图如下所示:

jafka-sq

上图呈现了Jafka Broker启动过程中主要涉及的类和调用方法,可以看到主要的代码集中在Server类的startup方法,其代码如下:

public void startup() {

try {

logger.info("Starting Jafka server "+serverInfo.getVersion());

Utils.registerMBean(serverInfo);

//检查上次服务端是否正常关闭,如果不是,要校验jafka文件,取出损坏的消息

boolean needRecovery = true;

File cleanShutDownFile = new File(new File(config.getLogDir()), CLEAN_SHUTDOWN_FILE);

if (cleanShutDownFile.exists()) {

needRecovery = false;

cleanShutDownFile.delete();

}

//初始化消息数据管理类LogManager,并将所有的消息数据按照一定格式读入内存(非数据内容本身)

this.logManager = new LogManager(config,//

scheduler,//

1000L * 60 * config.getLogCleanupIntervalMinutes(),//

1000L * 60 * 60 * config.getLogRetentionHours(),//

needRecovery);

this.logManager.setRollingStategy(config.getRollingStrategy());

logManager.load();

        //producer和consumer请求处理类,如写消息、抓取消息等
RequestHandlers handlers = new RequestHandlers(logManager);
//启动socket server端,处理producer和consumer的请求
socketServer = new SocketServer(handlers, config);
Utils.registerMBean(socketServer.getStats());
socketServer.startup();
Mx4jLoader.maybeLoad();
//如果开启了zookeeper连接,则将该broker信息注册到zookeeper中,并开启定时flush消息数据的线程
logManager.startup();
logger.info("Server started.");
} catch (Exception ex) {
logger.fatal("Fatal error during startup.", ex);
close();
} finally {
serverInfo.started();
}
}

对于上述代码的意义,可参见注释,另外作以下几点说明:

Jafka broker在正常关闭的时候会在数据文件夹下生成一个.jafka_cleanshutdown的文件,broker 在启动时可以通过检查该文件是否存在来判定上一次broker是否为正常关闭,如果不是正常关闭,那么jafka在打开每个topic-partition文件夹下最后一个jafka文件时会去校验其消息数据(即jafka文件),如果发现其上某条消息的实际长度不等于消息头中指定的长度,说明该消息有问题,则删除它及其以后的消息数据。具体实现后续会有源码分析。

LogManager是消息数据的管理类,负责消息的读写。其中load方法是将该broker数据文件夹下的所有消息数据以一定形式读入内存,以便读写。

SocketServer利用java的nio实现了一个高性能的socket服务器,来处理producer consumer的请求。

Jafka Broker的代码中最主要的两个类便是LogManager和SocketServer,后续文章也会从这两方面展开源码讲解。下面还是先看下Jafka源码结构

src

├── main

│ ├── assembly #maven assembly插件配置文件

│ ├── java

│ │ └── com

│ │ └── sohu

│ │ └── jafka

│ │ ├── admin #bin/admin-console.sh实现类

│ │ ├── api #request reponse的构建类,封装producer consumer的请求及返回

│ │ ├── cluster #搭建集群用到的一些类

│ │ ├── common #异常类和注解类

│ │ ├── console #bin/producer/consumer-console.sh的实现类

│ │ ├── consumer #consumer实现类

│ │ ├── log #消息数据管理的相关类

│ │ ├── message #消息数据的相关类,如格式定义、Message和offset的封装等

│ │ ├── mx #jmx的相关类,用于监控broker运行状况和管理broker

│ │ ├── network #socket服务器实现类

│ │ ├── producer #producer实现类

│ │ ├── server #broker的实现类,主要负责各类配置文件的封装,调用network和log下的SocketServer和LogManager启动服务端

│ │ └── utils #实用类封装

│ └── resources

└── test

├── java #测试方法,可以以此为入口学习jafka的使用和源码阅读

│ └── com

│ └── sohu

│ └── jafka

│ ├── admin

│ ├── api

│ ├── cluster

│ ├── common

│ ├── consumer

│ ├── log

│ ├── message

│ ├── producer

│ ├── server

│ └── utils

└── resources

小结

与Jafka broker相关的源码文件夹主要有server network log三个文件夹,大家在阅读源码的时候可以先从相关的单元测试文件下手,这样不至于陷于源码的茫茫森林里迷失方向。对于broker这一块,笔者后续会从Socket服务器和LogManager消息数据管理这两个方面展开来讲解。Jafka的源码实现清晰明了,非常值得学习,欢迎感兴趣的读者可以阅读并与笔者交流感悟。

Jafka Broker代码阅读之总览

Jafka Broker代码阅读之总览的更多相关文章

  1. Linux 0.11源码阅读笔记-总览

    Linux 0.11源码阅读笔记-总览 阅读源码的目的 加深对Linux操作系统的了解,了解Linux操作系统基本架构,熟悉进程管理.内存管理等主要模块知识. 通过阅读教复杂的代码,锻炼自己复杂项目代 ...

  2. 代码阅读分析工具Understand 2.0试用

    Understand 2.0是一款源代码阅读分析软件,功能强大.试用过一段时间后,感觉相当不错,确实可以大大提高代码阅读效率.由于Understand功能十分强大,本文不可能详尽地介绍它的所有功能,所 ...

  3. Android 上的代码阅读器 CoderBrowserHD 修改支持 go 语言代码

    我在Android上的代码阅读器用的是 https://github.com/zerob13/CoderBrowserHD 改造的版本,改造后的版本我放在 https://github.com/ghj ...

  4. Linux协议栈代码阅读笔记(二)网络接口的配置

    Linux协议栈代码阅读笔记(二)网络接口的配置 (基于linux-2.6.11) (一)用户态通过C库函数ioctl进行网络接口的配置 例如,知名的ifconfig程序,就是通过C库函数sys_io ...

  5. [置顶] Linux协议栈代码阅读笔记(一)

    Linux协议栈代码阅读笔记(一) (基于linux-2.6.21.7) (一)用户态通过诸如下面的C库函数访问协议栈服务 int socket(int domain, int type, int p ...

  6. 图形化代码阅读工具——Scitools Understand

    Scitools出品的Understand 2.0.用了很多年了,比Source Insight强大很多.以前的名字叫Understand for C/C++,Understand for Java, ...

  7. Python - 关于代码阅读的一些建议

    初始能力 让阅读思路保持清晰连贯,主力关注在流程架构和逻辑实现上,不被语法.技巧和业务流程等频繁地阻碍和打断. 建议基本满足以下条件,再开始进行代码阅读: 具备一定的语言基础:熟悉基础语法,常用的函数 ...

  8. MediaInfo代码阅读

      MediaInfo是一个用来分析媒体文件的开源工具. 支持的文件非常全面,基本上支持所有的媒体文件. 最近是在做HEVC开发,所以比较关注MediaInfo中关于HEVC的分析与处理. 从Meid ...

  9. Tools - 一些代码阅读的方法

    1 初始能力 让阅读思路清晰连贯,保持在程序的流程架构和逻辑实现上,不被语法.编程技巧和业务流程等频繁地阻碍和打断. 语言基础:熟悉基础语法,常用的函数.库.编程技巧等: 了解设计模式.构建工具.代码 ...

随机推荐

  1. POJ 1041 John's trip Euler欧拉回路判定和求回路

    就是欧拉判定,判定之后就能够使用DFS求欧拉回路了.图论内容. 这里使用邻接矩阵会快非常多速度. 这类题目都是十分困难的.光是定义的记录的数组变量就会是一大堆. #include <cstdio ...

  2. 关于android-support-v4.jar包的错误

    1.加入android-support-v4 误 java.lang.ClassNotFoundException: android.support.v4.view.ViewPager in load ...

  3. JavaScript第二课

    1.关于鼠标事件有: onmouseover(),onmouseout(),onmousedown(),onmouseup(),onclick()事件. 2.创建JavaScript对象: 方法1:通 ...

  4. Protocol Informatics (PI项目)【基于网络轨迹的协议逆向工程文献学习】

    Protocol Informatics[基于网络轨迹的协议逆向工程文献学习]by tsy 声明: 1)本报告由博客园bitpeach撰写,版权所有,免费转载,请注明出处,并请勿作商业用途.恕作者著作 ...

  5. STL源码剖析(set/map)

    SGI STL中set/map底层都是通过RB-tree实现的. 首先看看RB-tree结点的定义 typedef bool __rb_tree_color_type; const __rb_tree ...

  6. 用MyEclipse10.0远程连接Mysql数据库服务器

    说明:本文档所有的操作均在满足以下条件的情况下操作, A.远程Linux服务器已经安装好MySQL数据库 B.本地电脑可以ping通远程服务器 C.已经成功安装了Myeclipse 一.下载mysql ...

  7. Latex插入项目列表符号

    1. 关于 {itemize}里序号的形式 (这个在书里有介绍): latex默认生成的简单列表, 默认为一个小圆点,..... 而我们在写文章时可能想要一些不一样的列表符号, 比如 -, * 之类的 ...

  8. discuz开发笔记

    http://blog.csdn.net/tiangsu_php/article/details/7665125 http://www.discuz.net/thread-3225192-1-1.ht ...

  9. 百度地图和高德地图坐标系的互相转换 四种Sandcastle方法生成c#.net帮助类帮助文档 文档API生成神器SandCastle使用心得 ASP.NET Core

    百度地图和高德地图坐标系的互相转换   GPS.谷歌.百度.高德坐标相互转换 一.在进行地图开发过程中,我们一般能接触到以下三种类型的地图坐标系: 1.WGS-84原始坐标系,一般用国际GPS纪录仪记 ...

  10. loading数据加载的6种形式

    数据加载的几种形式及对应的交互设计 1.全屏加载 多出现在H5页面,例如微信的文章详情页.全屏加载的特点是数据一次性加载完成,内容加载完成之前界面都会停留在loading界面.进度条和有趣的动画设计, ...