This commit is contained in:
louzefeng
2024-07-11 05:50:32 +00:00
parent bf99793fd0
commit d3828a7aee
6071 changed files with 0 additions and 0 deletions

View File

@@ -0,0 +1,162 @@
<audio id="audio" title="加餐 | 搭建开发环境、阅读源码方法、经典学习资料大揭秘" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/45/a2/45f5bbfad965aab5a520cdf6de36a7a2.mp3"></audio>
你好,我是胡夕。
截止到现在专栏已经更新了38讲你掌握得怎么样了呢如果暂时掌握得不是很好也没有关系慢慢来有问题记得在留言区留言我们一起讨论。
今天我们来聊点儿不一样的。我总结了3个讨论热度很高的话题现在一一来为你“揭秘”。
1. 如何搭建Kafka开发环境很多人对于编译和调试Kafka饶有兴致却苦于无从下手。今天我就给你完整地演示一遍搭建Kafka开发环境的过程。
1. 如何阅读Kafka源码我曾经在专栏[第1讲](https://time.geekbang.org/column/article/98948)提到过我自己阅读Kafka源码的经历后来我收到很多留言问我是如何阅读的今天我就跟你分享一些阅读Kafka源代码的比较好的法则或者技巧。
1. Kafka的学习资料。幸运的是我在这方面还是有过一些总结的今天我会毫无保留地把资料全部分享给你。
## Kafka开发环境搭建
现在我先来回答第1个问题如何搭建Kafka开发环境。我以IDEA为例进行说明Eclipse应该也是类似的。
### 第1步安装Java和Gradle
要搭建Kafka开发环境你必须要安装好Java和Gradle同时在IDEA中安装Scala插件。你最好把Java和Gradle环境加入到环境变量中。
### 第2步下载Kafka的源码
完成第1步之后下载Kafka的源码命令如下
```
$ cd Projects
$ git clone https://github.com/apache/kafka.git
```
这个命令下载的是Kafka的trunk分支代码也就是**当前包含所有已提交Patch的最新代码甚至比Kafka官网上能够下载到的最新版本还要超前很多**。值得注意的是如果你想向Kafka社区贡献代码通常要以trunk代码为主体进行开发。
### 第3步下载Gradle的Wrapper程序套件
代码下载完成之后会自动创建一个名为kafka的子目录此时需要进入到该目录下执行下面的这条命令主要目的是下载Gradle的Wrapper程序套件。
```
$ gradle
Starting a Gradle Daemon (subsequent builds will be faster)
&gt; Configure project :
Building project 'core' with Scala version 2.12.9
Building project 'streams-scala' with Scala version 2.12.9
Deprecated Gradle features were used in this build, making it incompatible with Gradle 6.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/5.3/userguide/command_line_interface.html#sec:command_line_warning
```
### 第4步将Kafka源码编译打包成Jar文件
现在你可以运行下列命令将Kafka源码编译打包成Jar文件
```
./gradlew clean releaseTarGz
```
通常你需要等待一段时间经过一系列操作之后比如Gradle拉取依赖Jar包、编译Kafka源码、打包等你可以在core的build/distributions下面找到生成的tgz包kafka_2.12-2.4.0-SNAPSHOT。解压之后这就是一个可以正常启动运行的Kafka环境了。
### 第5步把Kafka源码工程导入到IDEA中
这也是搭建开发环境的最后一步。你可以先执行下面的命令去创建IDEA项目所需要的项目文件
```
$ ./gradlew idea #如果你用的是Eclipse执行./gradlew eclipse即可
```
接着你需要打开IDEA选择“打开工程”然后再选择kafka目录即可。
至此我们就在IDEA中搭建了Kafka源码环境。你可以打开Kafka.scala文件右键选择“运行”这时你应该可以看到启动Kafka Broker的命令行用法说明如下图所示
<img src="https://static001.geekbang.org/resource/image/14/3c/14c7b6c978106a07a1170a2402c3443c.png" alt="">
总体来说Kafka工程自从由使用sbt改为使用Gradle管理之后整个项目的编译和构建变得简单多了只需要3、4条命令就能在本机环境中搭建测试开发环境了。
## Kafka源码阅读方法
搭建好了开发环境下一步自然就是阅读Kafka源码并尝试自行修改源码了。下图是IDEA上Kafka工程的完整目录列表。
<img src="https://static001.geekbang.org/resource/image/6a/5d/6aa069bad076a0534d11d21c303a765d.png" alt="">
在这张图中,有几个子目录需要你重点关注一下。
- **core**Broker端工程保存Broker代码。
- **clients**Client端工程保存所有Client代码以及所有代码都会用到的一些公共代码。
- **streams**Streams端工程保存Kafka Streams代码。
- **connect**Connect端工程保存Kafka Connect框架代码以及File Connector代码。
我之前说过Kafka源码有50万行之多没有重点地进行通读效率会特别低。最初我就是盲读源码的深感效果极差所以我觉得非常有必要为你推荐几条最佳实践。
我建议你**先从core包读起也就是先从Broker端的代码着手**。你可以按照下面的顺序进行阅读。
1. **log包**。log包中定义了Broker底层消息和索引保存机制以及物理格式非常值得一读。特别是Log、LogSegment和LogManager这几个类几乎定义了Kafka底层的消息存储机制一定要重点关注。
1. **controller包**。controller包实现的是Kafka Controller的所有功能特别是里面的KafkaController.scala文件它封装了Controller的所有事件处理逻辑。如果你想弄明白Controller的工作原理最好多读几遍这个将近2000行的大文件。
1. **coordinator包下的group包代码**。当前coordinator包有两个子packagegroup和transaction。前者封装的是Consumer Group所用的Coordinator后者封装的是支持Kafka事务的Transaction Coordinator。我个人觉得你最好把group包下的代码通读一遍了解下Broker端是如何管理Consumer Group的。这里比较重要的是**GroupMetadataManager和GroupCoordinator类**它们定义了Consumer Group的元数据信息以及管理这些元数据的状态机机制。
1. **network包代码以及server包下的部分代码**。如果你还有余力的话可以再读一下这些代码。前者的SocketServer实现了Broker接收外部请求的完整网络流程。我们在专栏第24讲说过Kafka用的是Reactor模式。如果你想搞清楚Reactor模式是怎么在Kafka“落地”的就把这个类搞明白吧。
从总体流程上看Broker端顶部的入口类是KafkaApis.scala。这个类是处理所有入站请求的总入口下图展示了部分请求的处理方法
<img src="https://static001.geekbang.org/resource/image/be/f3/be172674a8e31e6f0b094eae709453f3.png" alt="">
你可以进到不同的方法里面去看实际的请求处理逻辑。比如handleProduceRequest方法是处理Producer生产消息请求的而handleFetchRequest方法则是处理消息读取请求的。
我们刚刚说的都是core代码包下的重要类文件。在客户端clients包下我推荐你重点阅读4个部分的内容。
1. **org.apache.kafka.common.record包。**这个包下面是各种Kafka消息实体类比如用于在内存中传输的MemoryRecords类以及用于在磁盘上保存的FileRecords类。
1. **org.apache.kafka.common.network包。**这个包不用全看你重点关注下Selector、KafkaChannel就好了尤其是前者它们是实现Client和Broker之间网络传输的重要机制。如果你完全搞懂了这个包下的Java代码Kafka的很多网络异常问题也就迎刃而解了。
1. **org.apache.kafka.clients.producer包**。顾名思义它是Producer的代码实现包里面的Java类很多你可以重点看看KafkaProducer、Sender和RecordAccumulator这几个类。
1. **org.apache.kafka.clients.consumer包。**它是Consumer的代码实现包。同样地我推荐你重点阅读KafkaConsumer、AbstractCoordinator和Fetcher这几个Java文件。
另外在阅读源码的时候不管是Broker端还是Client端你最好结合Java调试一起来做。通过Debug模式下打断点的方式一步一步地深入了解Kafka中各个类的状态以及在内存中的保存信息这种阅读方式会让你事半功倍。
## Kafka推荐学习资料
如果你暂时对搭建开发环境或阅读源码没有兴趣但又想快速深入地学习Kafka的话直接学习现成的资料也不失为一个妙法。接下来我就向你推荐一些很有价值的Kafka学习资料。
第1个不得不提的当然就是[Kafka官网](https://kafka.apache.org/documentation/)。很多人会忽视官网但其实官网才是最重要的学习资料。你只需要通读几遍官网并切实掌握里面的内容就已经能够较好地掌握Kafka了。
第2个是Kafka的[JIRA列表](https://issues.apache.org/jira/browse/KAFKA-8832?filter=-4&amp;jql=project%20%3D%20KAFKA%20ORDER%20BY%20created%20DESC)。当你碰到Kafka抛出的异常的时候不妨使用异常的关键字去JIRA中搜索一下看看是否是已知的Bug。很多时候我们碰到的问题早就已经被别人发现并提交到社区了。此时**JIRA列表就是你排查问题的好帮手**。
第3个是[Kafka KIP列表](https://cwiki.apache.org/confluence/display/KAFKA/Kafka+Improvement+Proposals)。KIP的全称是Kafka Improvement Proposals即Kafka新功能提议。你可以看到Kafka的新功能建议及其讨论。如果你想了解Kafka未来的发展路线KIP是不能不看的。当然如果你想到了一些Kafka暂时没有的新功能也可以在KIP中提交自己的提议申请等待社区的评审。
第4个是Kafka内部团队维护的[设计文档](https://cwiki.apache.org/confluence/display/KAFKA/Index)。在这里你几乎可以找到所有的Kafka设计文档。其中关于Controller和新版本Consumer的文章都很有深度我建议你一定要重点读一读。
第5个是著名的[StackOverflow论坛](https://stackoverflow.com/questions/tagged/apache-kafka?sort=newest&amp;pageSize=15)。当今StackOverflow论坛对程序员意味着什么想必我不说你也知道。这里面的Kafka问题很有深度。事实上从仅仅是StackOverflow上的一个问题到最后演变成了Kafka的Bug修复或新功能实现的情况屡见不鲜。
第6个是Confluent公司维护的[技术博客](https://www.confluent.io/blog/)。这是Kafka商业化公司Confluent团队自己维护的技术博客里面的技术文章皆出自Kafka Committer之手质量上乘我从中受益匪浅。比如讲述Kafka精确一次处理语义和事务的文章含金量极高你一定要去看一下。
第7个是我自己的[博客](https://www.cnblogs.com/huxi2b/)。我会定期在博客上更新Kafka方面的原创文章。有的是我对Kafka技术的一些理解有的是Kafka的最新动态。虽然不是国内质量最好的但应该是坚持时间最长的。毕竟我这个博客就只有Kafka的内容而且已经写了好几年了。
最后我给推荐你3本学习Kafka的书。
第1本是我的[《Apache Kafka实战》](https://book.douban.com/subject/30221096/)我在里面总结了我这几年使用和学习Kafka的各种实战心得。这本书成书于2018年虽然是以Kafka 1.0为模板撰写的而Kafka目前已经出到了2.3版本,但其消息引擎方面的功能并没有什么重大变化,因此绝大部分内容依然是有效的。
第2本是[《Kafka技术内幕》](https://book.douban.com/subject/27179953/)。我个人非常喜欢这个作者的书写风格,而且这本书内容翔实,原理分析得很透彻,配图更是精彩。
第3本是2019年新出的一本名为[《深入理解Kafka》](https://book.douban.com/subject/30437872/)的书。这本书的作者是一位精通RabbitMQ和Kafka的著名技术人对消息中间件有着自己独特的见解。
这些资料各有侧重,你可以根据自己的实际需求,选择相应的资料进行学习。
## 小结
好了我们来小结一下。在今天的文章里我跟你分享了很多经验比如如何搭建Kafka开发环境、如何阅读Kafka源码等希望这些经验可以帮你有效地节省时间避免走一些弯路。另外我把我收集到的相关学习资料全部列了出来分享给你也希望这些资料能够帮你更好地学习Kafka。
讲到这里,我想再强调一下,学习是个持续的过程。经验和外部帮助固然重要,但最关键的,还是自己要付出努力,持之以恒。
还是那句话Stay focused and work hard
<img src="https://static001.geekbang.org/resource/image/1b/f1/1b0cb1332a8d6a3a8eba22e3c98a4cf1.jpg" alt="">
## 开放讨论
最后我们来讨论这样一个问题你觉得学习Kafka或者任何一种技术最重要的是什么
欢迎写下你的思考和答案,我们一起讨论。如果你觉得有所收获,也欢迎把文章分享给你的朋友。

View File

@@ -0,0 +1,67 @@
<audio id="audio" title="用户故事 | 黄云:行百里者半九十" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/38/d8/38192d8d30c3aa9fbe22fda2551139d8.mp3"></audio>
你好我是黄云目前是一名后端开发工程师坐标苏州已经工作三载有余了。在“Kafka核心技术与实战”专栏刚刚上线的时候我就第一时间订阅了。在学习专栏的几个月时间里我有许多心得体会想要跟你分享一下。
## 为什么要学习“Kafka核心技术与实战”专栏
众所周知在当今时代“大数据”已经成为了一个家喻户晓的概念。动辄GB级、TB级甚至是PB级的大数据都需要服务器在短时间内进行处理。如何充分利用每台服务器的性能削峰填谷就成为了数据处理的关键。Kafka作为一种主流的消息队列工具已经被很多大公司使用。掌握Kafka成为了大数据时代必不可少的专项技能。
我们公司目前也在用Kafka对接实时流量数据数据量约20GB/天。作为一名开发工程师我必须要尽快掌握Kafka的核心技术修炼专项技能才能使其更好地为我所用。一直以来在工作之余我都会主动地搜集Kafka的相关资料看各位大佬的分享。但是那些零散的碎片拼凑在一起却始终很难形成一个系统的知识体系这也是一直让我很头疼的事情。
## “道”与“术”的平衡
作为一名程序员我和很多人都一样看到好的东西就想动手实践。在刚刚了解到Kafka的强大功能之后我就迫不及待地参照Kafka官网的教程着手搭建Kafka的服务器。除此之外我还曾小试牛刀在1万条/s的实时环境对接中使用了Kafka作为消息队列。
但是,在实际使用过程中,我发现了一个严重的问题,那就是,**我只知道如何去用,但不知道如何用好**。意识到这个问题后,我赶紧查看了官网以及很多主流网站的文章。官网上将几百个参数一一列出,并注明含义,其他资料则普遍重理论,轻实践。总体来看,这些内容都将“道”放在了第一位,却完全忽略了“术”的实现。
说实话,我们程序员看到这些文章,其实是很恼火的。盯着满篇的原理,却完全不知道从何处下手,那就注定无法解决我的实际问题。
直到有一天我无意中发现胡夕老师的专栏“Kafka核心技术与实战”在极客时间上线了顿时有一种如获至宝的感觉。看完课程简介和开篇词之后我觉得这就是我一直期待看到的课程于是就立即订阅了。从此以后每周二、四、六准时学习更新的文章逐渐成为了我的习惯。
在学习过程中我印象最深刻的是胡夕老师在讲参数配置的时候在第7讲和第8讲的标题中用了3个“最”字即“最最最重要的集群参数配置”并且在文章里分享了最重要、最核心的集群参数配置。看完这两讲之后我一直以来持有的对于“Kafka配置优化过程中怎么有这么多参数”的怨念才得以消解。**不必贪多求全,只要掌握最核心的内容就可以了**。胡夕老师的专栏真正做到了“道”与“术”的平衡慢慢地为我揭开了Kafka的神秘面纱。
## 我是怎么学习专栏的?
说实话查看极客时间的专栏是一件十分愉悦的事情。每天清晨正式开始工作前的20分钟是我固定的学习专栏的时间。学习Kafka专栏时注意力必须高度集中因为里面干货非常多。如果只是粗浅阅读不加思考就会留下很多问题。
当我遇到困惑的时候,第一件事就是查看文章下面的评论。很多人的总结概括能力都非常强,能对信息进行二次加工和提炼,这些留言帮助我对文章内容进行了二次梳理。最重要的是,我经常在留言里看到和我一样的困惑,瞬间就有种找到同类的感觉,这也是一种很奇妙的体验。
胡夕老师回复也很及时,第一时间解决我们的疑惑。**今日疑,今日解,不积攒遗留问题**,也能让我更加高效地学习后面的内容。
在学习专栏时,我走过一些弯路,也在不断调整地自己的学习方法和习惯。在这个过程中,我吸取了一些经验,也有很多的感悟,想要跟你分享一下。
<li>
**多思考,多总结**。每次查看留言区评论的时候,我都会先自己思考一下问题的答案,等老师回复之后,我会对照着确认下答案。很多时候,我在留言区看其他人的总结,总觉得言简意赅,但是自己描述的话,就会发现自己完全没有这种抽象概括的能力。换句话说,就是**没有办法用自己的话描述出文章表达的含义,其实也就是没有真正地理解文章的内容**。所以,我就一直跟自己强调,要多总结,提升自己的概括能力。
</li>
<li>
**多动手实践,实践出真知**。专栏中有很多实践的知识,我每次发现可操作性比较强的内容时,就会自己在搭建的测试环境下进行实践,查看实践结果。这样一来,我就对课程的内容有了更好的理解与掌握。
</li>
<li>
**多回头看,不留疑惑**。我发现,专栏里的很多重点内容,我只读一遍的话,印象会不太深刻,但隔一段时间再去回顾,就会有很多新的认知和收获。有些章节满篇都是干货,一旦遇到不懂的术语,大脑就会本能地跳过。在意识到大脑的这个惯性动作之后,我再遇到不懂的问题时,就会主动花时间去查询相关资料,直到理解术语的含义。否则,一知半解地往下读,对后面的理解会有很大的影响。
</li>
<li>
**多记笔记**。对于一些我很感兴趣的课程内容,我会有针对性地进行记录。在记录时,我一般不会直接复制粘贴原文,而是用自己的话写出来。如果实在写不出来,就把原文摘抄一遍,这样也会加深理解。
</li>
<li>
**多提问**。针对一些自己实在无法理解的问题,我就让自己多提问、多留言。每次老师回答完我的问题,我都觉得非常开心,后续的学习劲头也会更高,这可能就是老师经常提到的提高参与感吧。
</li>
关于留言这件事情,我想跟你分享一下我曾经的心理变化。刚开始学习时,遇到不懂的问题,其实我是不敢提问的,因为我担心我之所以不懂这个问题,是自己理解能力有问题,怕提问的问题过于低级,只好藏着。但是后来我发现,越是这样,我越不懂,慢慢就丧失了很多学习热情。意识到这一点之后,我就及时调整了学习策略,不断提醒自己:对于思考之后实在不能理解的问题,一定要多问。**不藏拙,才是成长的最佳路径。**
## 学习专栏有什么收获?
学习这个专栏我最大的收获就是对Kafka的原理、机制以及参数的理解更加深入了。我很佩服胡夕老师的抽象概括能力。胡夕老师花费了一年多的时间阅读Kafka的源码以及相关文献但最后呈现给我们的并不是长篇大论而是经过多次抽象总结的内容。老师从我们用户最关心的入门、配置、客户端、内核、监控这几个点去介绍Kafka的内容将官方文档的上百个参数精简成十几个重要的参数将几百页的内容抽象成几十讲的核心知识。
这一点让我很受启发。在学习过程中,追求大而全并不好,我们只需要掌握实际生产环境中最常用的那么十几个参数,保障消息传输稳定、快速、不丢失就可以了。很多很深奥的内容,如果精力和时间允许的话,再去深究,**要以终为始,不能钻牛角尖**。
可能只有程序员才知道阅读大段的源码是多么痛苦的事情但胡夕老师做到了而且还在“加餐”中分享了他阅读源码的方法。令人欣喜的是胡夕老师是直接将源码在IDE中展示出来并且对着实际代码描述阅读代码的方式实操性很强。而这一点其实正好符合我当初选择学习Kafka专栏的预期。专栏里的大部分内容都是可以落地实践的。**勿在浮沙筑高台**,胡夕老师就是这样一步一步地带着我们稳步前进的。
## 总结
专栏不知不觉就结束了比较惭愧的是我后半段没能跟上老师的节奏做到更新1讲阅读1讲往往是堆积了好久才去阅读。但是我真的很感谢胡夕老师的付出老师在专栏里分享的内容让我对Kafka的参数以及一些实战性很强的知识形成了自己的理解。
胡夕老师在专栏中提过一句话,我印象非常深刻,“**行百里者半九十**”Kafka的学习之旅不会随着专栏的完结而停止只是读完专栏的内容其实才走了旅程的一半而已。后续的话针对专栏中提到的落地信息我会一一记录并实践对于Kafka真正做到能懂、会用、能用好。
好了,我的分享就到此结束了。你在学习专栏的过程中,有没有什么独特的学习方法和心路历程呢?欢迎你写在留言区,我很期待能跟你在这里交流、讨论,一起学习进步。