持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情
哈喽,大家好,我是一条。
今天和大家聊聊 kafka 的源码阅读环境搭建,网上其实有很多教程,但是都搞得过于复杂,现在 Idea 已经把大部分工作都帮我们做了,完全就是傻瓜式搭建。
所以本文的重点在于源码的阅读路线,请大家收藏好。
1.安装 scala 插件即可
2.gradle 环境 idea 会自动为我们安装,不再需要单独安装配置
源码地址
git clone https://github.com/apache/kafka.git
导入 Idea
导入之后会自动下载构建 gradle ,关于 gradle ,你可以认为他和 Maven 是一样的产品,想了解的更多可以以去搜索其他文章,这不是本文的重点。
构建的过程时间会比较长,请耐心等待。
scala 插件
工程目录
在这张图中,有几个子目录需要重点关注一下。
- core:Broker 端工程,保存 Broker 代码。
- clients:Client 端工程,保存所有 Client 代码以及所有代码都会用到的一些公共代码。
- streams:Streams 端工程,保存 Kafka Streams 代码。
- connect:Connect 端工程,保存 Kafka Connect 框架代码以及 File Connector 代码。
阅读路线
Kafka 源码有 50 万行之多,没有重点地进行通读,效率会特别低。所以我们要以场景驱动阅读,推荐几条最佳阅读路线:
1.从 Broker 端的代码着手
建议你先从 core 包读起,也就是先从 Broker 端的代码着手。可以按照下面的顺序进行阅读。
- log 包:log 包中定义了 Broker 底层消息和索引保存机制以及物理格式,非常值得一读。特别是 Log、LogSegment 和 LogManager 这几个类,几乎定义了 Kafka 底层的消息存储机制,一定要重点关注。
- controller 包。controller 包实现的是 Kafka Controller 的所有功能,特别是里面的 KafkaController.scala 文件,它封装了 Controller 的所有事件处理逻辑。如果你想弄明白 Controller 的工作原理,最好多读几遍这个将近 2000 行的大文件。
- coordinator 包下的 group 包代码。当前,coordinator 包有两个子 package:group 和 transaction。前者封装的是 Consumer Group 所用的 Coordinator;后者封装的是支持 Kafka 事务的 Transaction Coordinator。我个人觉得你最好把 group 包下的代码通读一遍,了解下 Broker 端是如何管理 Consumer Group 的。这里比较重要的是GroupMetadataManager 和 GroupCoordinator 类,它们定义了 Consumer Group 的元数据信息以及管理这些元数据的状态机机制。
- network 包代码以及 server 包下的部分代码。如果你还有余力的话,可以再读一下这些代码。前者的 SocketServer 实现了 Broker 接收外部请求的完整网络流程。Kafka 用的是 Reactor 模式。如果你想搞清楚 Reactor 模式是怎么在 Kafka“落地”的,就把这个类搞明白吧。
从总体流程上看,Broker 端顶部的入口类是 KafkaApis.scala。这个类是处理所有入站请求的总入口。
2.客户端 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 文件。
通过 Debug 模式下打断点的方式,一步一步地深入了解 Kafka 中各个类的状态以及在内存中的保存信息,这种阅读方式会让你事半功倍。
最后
源码阅读是一个很枯燥的过程,但是一旦把这块大骨头啃下来,你的工资、阅历、思想都会有一个质的飞跃,根据我身边大佬的情况来看,熟读 Kafka 源码的大佬都是大厂的技术总监或专家。
所以我们切不可把源码下载下来就不看了,一定要以场景驱动阅读,啃下这块骨头。
本文参考: 胡夕——Kafka核心技术与实战