源码已经编辑,且导入idea,后续就可以read it
1. 总体结构
重点关注的目录:
- core :Broker 端工程,保存 Broker 代码。
- clients :Client 端工程,保存所有 Client 代码以及所有代码都会用到的一些公共代码。
- streams :Streams 端工程,保存 Kafka Streams 代码。
- connect :Connect 端工程,保存 Kafka Connect 框架代码以及 File Connector 代码。
2. 源码阅读顺序
-
log 包 : log 包中定义了 Broker 底层消息和索引保存机制以及物理格式。 Log、LogSegment 和 LogManager 这几个类,几乎定义了 Kafka 底层的消息存储机制。
-
controller 包 : controller 包实现的是 Kafka Controller 的所有功能,KafkaController.scala 文件,它封装了 Controller 的所有事件处理逻辑。如果你想弄明白 Controller 的工作原理,最好多读几遍。
-
coordinator 包下的 group 包代码 : 当前,coordinator 包有两个子 package:group 和 transaction。前者封装的是 Consumer Group 所用的 Coordinator;后者封装的是支持 Kafka 事务的 Transaction Coordinator。了解下 Broker 端是如何管理 Consumer Group 的。这里比较重要的是 GroupMetadataManager 和 GroupCoordinator 类,它们定义了 Consumer Group 的元数据信息以及管理这些元数据的状态机机制。
-
network 包代码以及 server 包下的部分代码。
-
Broker 端顶部的入口类是 KafkaApis.scala。这个类是处理所有入站请求的总入口
-
clients包:
-
org.apache.kafka.common.record 包。这个包下面是各种 Kafka 消息实体类,比如用于在内存中传输的 MemoryRecords 类以及用于在磁盘上保存的 FileRecords 类。
-
org.apache.kafka.common.network 包。重点关注下 Selector、KafkaChannel 就好了,尤其是前者,它们是实现 Client 和 Broker 之间网络传输的重要机制。如果你完全搞懂了这个包下的 Java 代码,Kafka 的很多网络异常问题也就迎刃而解了。
-
org.apache.kafka.clients.producer 包。顾名思义,它是 Producer 的代码实现包,里面的 Java 类很多,你可以重点看看 KafkaProducer、Sender 和 RecordAccumulator 这几个类。
-
org.apache.kafka.clients.consumer 包。它是 Consumer 的代码实现包。同样地,重点阅读 KafkaConsumer、AbstractCoordinator 和 Fetcher 这几个 Java 文件。
3. core模块里的核心包
模块名 | 说明 |
admin | kafka的管理员模块,操作和管理其topic,partition相关,包含创建,删除 |
api | 主要负责数据交互,客户端与服务端交互数据的编码与解码。 |
cluster | 这里包含多个实体类,有Broker,Cluster,Partition,Replica。其中一个Cluster由多个Broker组成,一个Broker包含多个Partition,一个Topic的所有Partition分布在不同的Broker中,一个Replica包含都个Partition。 |
common | 这是一个通用模块,其只包含各种异常类以及错误验证。 |
consumer | 消费者处理模块,负责所有的客户端消费者数据和逻辑处理。 |
controller | 此模块负责中央控制器的选举,分区的Leader选举,Replica的分配或其重新分配,分区和副本的扩容等。 |
coordinator | 负责管理部分consumer group和他们的offset。 |
log | 这是一个负责Kafka文件存储模块,负责读写所有的Kafka的Topic消息数据。 |
message | 封装多条数据组成一个数据集或者压缩数据集。 |
metrics | 负责内部状态的监控模块。 |
network | 该模块负责处理和接收客户端连接,处理网络时间模块。 |
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命令行工具类,以及公共日志类等内容。 |