在对Kafka使用层面掌握后,进一步提高分析其源码是极有必要的。纵观Kafka源码工程结构,不算太复杂,代码量也不算大。分析研究其实现细节难度不算太大。今天笔者给你们分析的是其核心处理模块,core模块。java
首先,咱们须要对Kafka的工程结构有一个总体的认知度,Kafka 你们最为熟悉的就是其消费者与生产者。然其,底层的存储机制,选举机制,备份机制等实现细节,须要咱们对其源码仔细阅读学习,思考与分析其设计之初的初衷。下面,咱们首先来看看Kafka源码工程模块分布,截止当天日期,官方托管在 Github 上的 Kafka 源码版本为:0.10.2.1,其工程分布结构以下图所示:git
这里笔记只针对core模块进行说明,其余模块均是启动脚本,文档说明,测试类或是Java客户端的相关代码,本篇博客就很少作赘述了。github
模块名 | 说明 |
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命令行工具类,以及公共日志类等内容。 |
阅读Kafka源码须要准备如下环境:api
关于环境的搭建,你们能够利用搜索引擎去完成,比较基础,这里就很少赘述了。而后在源码工程目录下执行如下命令:缓存
如何选择,可按照本身所使用的编辑器便可。这里笔者所使用的是IDEA,执行命令后,会在源码目录生成如下文件,以下图所示:安全
而后,在编辑器中导入该源码项目工程便可,以下图所示:网络
这里,咱们先在config模块下设置server.properties文件,按照本身的须要设置,好比分区数,log的存储路径,zookeeper的地址设置等等。而后,咱们在编辑器中的运行中设置相关的启动参数,以下图所示:eclipse
启动类Kafka.scala在core模块下,须要注意的是,这里在启动Kafka以前,确保咱们以前在server.properties文件中所配置的Zookeeper集群已正常运行,而后咱们在编辑器中运行Kafka源码,以下图所示:异步
这里,咱们作一下简单的修改,在启动类的开头打印一句启动日志和启动时间,部分运行日志和运行结果截图以下所示:编辑器
Start Kafka,DateTime[1494065094606] [2017-05-06 18:04:54,830] INFO KafkaConfig values: advertised.host.name = null advertised.listeners = null advertised.port = null authorizer.class.name = auto.create.topics.enable = true auto.leader.rebalance.enable = true background.threads = 10 broker.id = 0 broker.id.generation.enable = true broker.rack = null compression.type = producer connections.max.idle.ms = 600000 controlled.shutdown.enable = true
如上图,红色框便是咱们简单的添加的一句代码。
本篇博客给你们介绍了Kafka源码的core模块下各个子模块所负责的内容,以及如何便捷的去阅读源码,以及在编辑器中运行Kafka源码。后续,再为你们分析Kafka的存储机制,选举机制,备份机制等内容的实现细节。最后,欢迎你们使用Kafka-Eagle监控工具。
这篇博客就和你们分享到这里,若是你们在研究学习的过程中有什么问题,能够加群进行讨论或发送邮件给我,我会尽我所能为您解答,与君共勉!