Kafka 源码剖析
1.概述
在对Kafka使用层面掌握后,进一步提升分析其源码是极有必要的。纵观Kafka源码工程结构,不算太复杂,代码量也不算大。分析研究其实现细节难度不算太大。今天笔者给大家分析的是其核心处理模块,core模块。
2.内容
首先,我们需要对Kafka的工程结构有一个整体的认知度,Kafka 大家最为熟悉的就是其消费者与生产者。然其,底层的存储机制,选举机制,备份机制等实现细节,需要我们对其源码仔细阅读学习,思考与分析其设计之初的初衷。下面,我们首先来看看Kafka源码工程模块分布,截止当天日期,官方托管在 Github 上的 Kafka 源码版本为:0.10.2.1,其工程分布结构如下图所示:
这里笔记只针对core模块进行说明,其他模块均是启动脚本,文档说明,测试类或是Java客户端的相关代码,本篇博客就不多做赘述了。
模块名 | 说明 |
admin | kafka的管理员模块,操作和管理其topic,partition相关,包含创建,删除topic,或者拓展分区等。 |
api | 主要负责数据交互,客户端与服务端交互数据的编码与解码。 |
client | 该模块下就一个类,producer读取kafka broker元数据信息,topic和分区,以及leader。 |
cluster | 这里包含多个实体类,有Broker,Cluster,Partition,Replica。其中一个Cluster由多个Broker组成,一个Broker包含多个Partition,一个Topic的所有Partition分布在不同的Broker中,一个Replica包含都个Partition。 |
common | 这是一个通用模块,其只包含各种异常类以及错误验证。 |
consumer | 消费者处理模块,负责所有的客户端消费者数据和逻辑处理。 |
controller | 此模块负责中央控制器的选举,分区的Leader选举,Replica的分配或其重新分配,分区和副本的扩容等。 |
coordinator | 负责管理部分consumer group和他们的offset。 |
javaapi | 提供Java语言的producer和consumer的API接口。 |
log | 这是一个负责Kafka文件存储模块,负责读写所有的Kafka的Topic消息数据。 |
message | 封装多条数据组成一个数据集或者压缩数据集。 |
metrics | 负责内部状态的监控模块。 |
network | 该模块负责处理和接收客户端连接,处理网络时间模块。 |
producer | 生产者的细节实现模块,包括的内容有同步和异步的消息发送。 |
security | 负责Kafka的安全验证和管理模块。 |
serializer | 序列化和反序列化当前消息内容。 |
server | 该模块涉及的内容较多,有Leader和Offset的checkpoint,动态配置,延时创建和删除Topic,Leader的选举,Admin和Replica的管理,以及各种元数据的缓存等内容。 |
tools | 阅读该模块,就是一个工具模块,涉及的内容也比较多。有导出对应consumer的offset值;导出LogSegments信息,以及当前Topic的log写的Location信息;导出Zookeeper上的offset值等内容。 |
utils | 各种工具类,比如Json,ZkUtils,线程池工具类,KafkaScheduler公共调度器类,Mx4jLoader监控加载器,ReplicationUtils复制集工具类,CommandLineUtils命令行工具类,以及公共日志类等内容。 |
3.源码环境
阅读Kafka源码需要准备以下环境:
- JDK
- IDE(Eclipse,IDEA或者其他)
- gradle
关于环境的搭建,大家可以利用搜索引擎去完成,比较基础,这里就不多赘述了。然后在源码工程目录下执行以下命令:
- gradle idea(编辑器为IDEA)
- gradle eclipse(编辑器为Eclipse)
如何选择,可按照自己所使用的编辑器即可。这里笔者所使用的是IDEA,执行命令后,会在源码目录生成以下文件,如下图所示:
然后,在编辑器中导入该源码项目工程即可,如下图所示:
4.运行源码
这里,我们先在config模块下设置server.properties文件,按照自己的需要设置,比如分区数,log的存储路径,zookeeper的地址设置等等。然后,我们在编辑器中的运行中设置相关的启动参数,如下图所示:
启动类Kafka.scala在core模块下,需要注意的是,这里在启动Kafka之前,确保我们之前在server.properties文件中所配置的Zookeeper集群已正常运行,然后我们在编辑器中运行Kafka源码,如下图所示:
5.预览结果
这里,我们做一下简单的修改,在启动类的开头打印一句启动日志和启动时间,运行结果如下所示:
如上图,红色框即是我们简单的添加的一句代码。
6.总结
本篇博客给大家介绍了Kafka源码的core模块下各个子模块所负责的内容,以及如何便捷的去阅读源码,以及在编辑器中运行Kafka源码。后续,再为大家分析Kafka的存储机制,选举机制,备份机制等实现细节。
7.结束语
这篇博客就和大家分享到这里,如果大家在研究学习的过程当中有什么问题,可以加群进行讨论或发送邮件给我,我会尽我所能为您解答,与君共勉!
Kafka 源码剖析的更多相关文章
- Apache Kafka 源码剖析
Getting Start 下载 http://kafka.apache.org/ 优点和应用场景 Kafka消息驱动,符合发布-订阅模式,优点和应用范围都共通 发布-订阅模式优点 解耦合 : 两个应 ...
- Apache Spark源码剖析
Apache Spark源码剖析(全面系统介绍Spark源码,提供分析源码的实用技巧和合理的阅读顺序,充分了解Spark的设计思想和运行机理) 许鹏 著 ISBN 978-7-121-25420- ...
- 《Apache Spark源码剖析》
Spark Contributor,Databricks工程师连城,华为大数据平台开发部部长陈亮,网易杭州研究院副院长汪源,TalkingData首席数据科学家张夏天联袂力荐1.本书全面.系统地介绍了 ...
- (升级版)Spark从入门到精通(Scala编程、案例实战、高级特性、Spark内核源码剖析、Hadoop高端)
本课程主要讲解目前大数据领域最热门.最火爆.最有前景的技术——Spark.在本课程中,会从浅入深,基于大量案例实战,深度剖析和讲解Spark,并且会包含完全从企业真实复杂业务需求中抽取出的案例实战.课 ...
- jQuery之Deferred源码剖析
一.前言 大约在夏季,我们谈过ES6的Promise(详见here),其实在ES6前jQuery早就有了Promise,也就是我们所知道的Deferred对象,宗旨当然也和ES6的Promise一样, ...
- kafka源码分析之一server启动分析
0. 关键概念 关键概念 Concepts Function Topic 用于划分Message的逻辑概念,一个Topic可以分布在多个Broker上. Partition 是Kafka中横向扩展和一 ...
- Nodejs事件引擎libuv源码剖析之:高效线程池(threadpool)的实现
声明:本文为原创博文,转载请注明出处. Nodejs编程是全异步的,这就意味着我们不必每次都阻塞等待该次操作的结果,而事件完成(就绪)时会主动回调通知我们.在网络编程中,一般都是基于Reactor线程 ...
- 基于mybatis-generator-core 1.3.5项目的修订版以及源码剖析
项目简单说明 mybatis-generator,是根据数据库表.字段反向生成实体类等代码文件.我在国庆时候,没事剖析了mybatis-generator-core源码,写了相当详细的中文注释,可以去 ...
- STL"源码"剖析-重点知识总结
STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点略多 :) 1.STL概述 STL提供六大组件,彼此可以组合 ...
随机推荐
- ubuntu查看安装的cuda toolkit自带的工具及其他安装文件
原创作品,转载请注明来源:http://www.cnblogs.com/shrimp-can/p/5253672.html 1.查看工具 默认目录为:local,进入local:cd /usr/loc ...
- 基于Intranet的零件库管理信息系统设计--part02
昨天建了第一个子表,今天继续. 按照这个一个一个来: 轴承参数查询如下(来源:轴承查询型号网) 照这个来大概就是这么几个属性: 轴承主键,轴承名称,新型号,旧型号,内径,外径,宽度,Cr,Cor(话说 ...
- NumPy入门及基础
1.1 NumPy 数组对象 NumPy中的ndarray是一个多维数组对象,该对象由两部分组成: 实际的数据; 描述这些数据的元数据. 大部分的数组操作仅仅修改元数据部分,而不改变底层的实际 ...
- 牛顿迭代法求开根号。 a^1/2_______Xn+1=1/2*(Xn+a/Xn)
#include <stdio.h>#include <math.h>int main(void){ double a,x1=1.0,x2; printf("plea ...
- 【前端调试手机页面】分享一款便捷的调试工具--spy-debugger
spy-debugger : 微信调试,各种WebView样式调试.手机浏览器的页面真机调试.便捷的远程调试手机页面.抓包工具,支持:HTTP/HTTPS,无需USB连接设备. github地址: ...
- webots自学笔记(六)实用控制器函数补充
原创文章,来自"博客园,_阿龙clliu" http://www.cnblogs.com/clliu/,转载请注明原文章出处. 用Webots软件做机器人仿真时,可以编 ...
- java中的==、equals()、hashCode()源码分析
转载自:http://www.cnblogs.com/xudong-bupt/p/3960177.html 在Java编程或者面试中经常会遇到 == .equals()的比较.自己看了看源码,结合实际 ...
- 如何在多个项目中分离Asp.Net Core Mvc的Controller和Areas
前言 软件系统中总是希望做到松耦合,项目的组织形式也是一样,本篇文章将介绍在ASP.NET CORE MVC中怎么样将Controller与主网站项目进行分离,并且对Areas进行支持. 实践 1.新 ...
- Oracle dual表的用途
dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录.我们可以用它来做很多事情,如下: 1.查看当前用户,可以在 SQL Plus中执行下面语句 sele ...
- JavaEE开发使用Maven管理的SpringMVC工程
前几篇博客已经陆陆续续的聊了一些Spring的东西,今天博客我们就来聊一下SpringMVC.SpringMVC目前在JavaEE开发中可谓占据一席之地,用起来也是比较顺手的.低耦合,高内聚,利用一些 ...