值不值得学:先想清楚你是不是真要啃源码
很多做后端的人对 Kafka 的认知停留在配置和调参层面,能发消息、能消费、不丢数据就行。但只要遇到吞吐瓶颈、消息积压、副本同步异常,或者要在面试里讲清楚高可用机制,停留在 API 层就不够了。这门课解决的就是从会用到底层原理的跨越,它不是教你配置参数,而是带你读 Kafka 内核源码,搞清楚网络模型、存储结构、消费组协调、副本机制这些核心模块到底是怎么落地的。如果你只是想快速上手写业务,这门课性价比不高;如果你是正在准备中高级后端面试、或者在工作中要负责消息中间件运维和性能调优的人,这课的针对性很强。
适合什么基础、建议先看哪几块
这课不适合零基础。默认你已经熟悉 Java,能看懂基本并发和网络编程,平时用过 Kafka 发消息,知道 topic、partition、consumer 这些概念。如果这些对你还陌生,建议先补基础再来,否则源码部分会卡得很痛苦。建议先看课程大纲,理清整体脉络,然后从环境搭建那一节开始跟着走,别跳过,因为源码环境跑不起来后面全没法跟。重点先抓网络通信和日志存储这两块,它们是 Kafka 性能的根基,也是面试最常问的部分;消费组和副本同步部分可以放后面,结合实际遇到的问题对照着看。
学完能独立做什么、资料怎么配合练习
学完之后,你应该能独立阅读 Kafka 源码,定位线上消息中间件问题的根因,而不是只靠搜索引擎和日志猜。在架构设计层面,你能说清楚 Kafka 为什么快、高可用怎么保证、一致性怎么实现,这对做技术选型和方案评审都有直接帮助。资料使用上,建议先通读一遍课程笔记建立框架感,再看视频跟着讲师逐段过源码,遇到关键模块暂停,对照项目代码自己跑一遍调试。不要只看不练,源码课的吸收率很大程度取决于你有没有真的在本地把项目跑起来打断点跟踪。看完一个模块后,尝试用自己的话复述核心流程,讲不清楚的地方就是没懂的地方,回去重看。
本页收录 儒猿Kafka消息中间件内核源码精讲,方向为体系课,重点涉及 体系课。
适合正在补 体系课 相关知识、想按目录逐步推进的学习者。
下方为完整资料与目录,可先看目录判断是否符合需要。
01 课程大纲.html · 01 课程大纲.pdf · 02 课程笔记、项目代码.html · 02 课程笔记、项目代码.pdf · 03 001_Kafka
课程目录
* 01 课程大纲.html
* 01 课程大纲.pdf
* 02 课程笔记、项目代码.html
* 02 课程笔记、项目代码.pdf
* 03 001_Kafka源码分析环境搭建:JDK、Scala以及Gradle的安装
* 04 002_Kafka源码分析环境搭建:在Windows上部署和启动ZooKeeper_ev
* 05 003_Kafka源码分析环境搭建:使用Gradle来构建Kafka源码_ev
* 06 004_Kafka源码分析环境搭建:将构建好的Kafka源码导入IntelliJ IDEA_ev
* 07 005_Kafka源码分析环境搭建:对IntelliJ IDEA中的Kafka进行正确配置_ev
* 08 006_Kafka源码分析环境搭建:直接在IntelliJ IDEA中启动Kafka_ev
* 09 007_Kafka源码分析环境搭建:验证IntelliJ IDEA中启动的Kafka能否使_ev
* 10 008_从一条消息的生产发送开始如何逐步探索Kafka运行的全流程
* 11 009_回顾一下Kafka生产端是如何进行开发的以及涉及哪些东西
* 12 010_生产端的核心:KafkaProducer初始化时会涉及到哪些组件
* 13 011_集群元数据拉取组件的分析以及多个拉取触发时机的分析
* 14 012_在源码中分析核心参数的含义:请求超时、缓冲大小、请求大小
* 15 013_内存缓冲区的构建以及消息batch打包发送request的原理
* 16 014_底层的网络通信组件初探以及核心网络参数的分析
* 17 015_数据发送线程是如何初始化以及acks参数在源码中的含义分析
* 18 016_KafkaProducer初始化的时候到底会不会去拉取集群元数据
* 19 017_分析一下Kafka集群元数据在客户端缓存采用的数据结构
* 20 018_初步窥探客户端发送消息时源码运行的大致流程
* 21 019_从未有过的细致源码研究:工业级的客户端如何进行异常处理
* 22 020_如何对topic元数据进行细粒度的按需加载以及同步等待
* 23 021_为了搞清楚元数据加载的过程,回头看看Sender线程的初始化
* 24 022_是否有必要现在就对底层的网络通信组件深入分析
* 25 023_如果没有指定分区key是如何对消息负载均衡分发到分区的
* 26 024_如何根据分区key将消息路由到同一个分区中去
* 27 025_快速过一下在将消息发送到内存缓冲区之前做的准备工作
* 28 026_大致浏览一下源码中将消息写入内存缓冲的运行流程
* 29 027_如何基于CopyOnWriteMap实现线程安全的分区队列构建
* 30 028_对队列加锁之后尝试将消息放入队列已有的batch中
* 31 029_如果内存空间充足,那么如何基于NIO ByteBuffer分配内存
* 32 030_为什么要在内存缓冲写入算法中引入double-check模式
* 33 031_如何基于申请的ByteBuffer构造Batch并放入队列
* 34 032_一条消息是如何按照二进制协议写入Batch的ByteBuffer的
* 35 033_频繁写入的消息是如何直接进入已有的分区batch中的
* 36 034_如果一个Batch被写满了,如何申请内存块构建下一个Batch
* 37 035_如何基于缓冲池中的ByteBuffer来复用内存空间
* 38 036_不断申请内存空间的情况下导致可用内存耗尽了怎么办
* 39 037_Kafka生产端唯一的一个IO线程到底在干什么
* 40 038_内存缓冲中的Batch到底是如何被判定为可以发送出去的(一)
* 41 039_内存缓冲中的Batch到底是如何被判定为可以发送出去的(二)
* 42 040_内存缓冲中的Batch到底是如何被判定为可以发送出去的(三)
* 43 041_如何检查筛选出来的目标Broker可以发送数据过去
* 44 042_如果跟Broker之间还没建立连接,如何检查是否可以建立连接_ev
* 45 043_深入底层网络通信的起点:通过哪个核心组件与Broker建立连接_ev
* 46 044_回头看看NetworkClient网络通信组件是如何初始化的_ev
* 47 045_惊讶的发现:Kafka网络通信底层是基于原生的Java NIO开发的!_ev
* 48 046_KafkaChannel是如何对原生Java NIO的SocketChannel进_ev
* 49 047_Kafka封装的Selector是如何初始化与Broker的连接的_ev
* 50 048_工业级组件中的NIO:KeepAlive、SocketBuffer、TcpNoDe
* 51 049_NIO中的SocketChannel.connect到底具备什么样的业务语义
* 52 050_发起连接请求之后针对不同的情况是如何进行缓存的
* 53 051_给大家一个学习工业级NIO编程的提示:封装原生API以及缓存机制
* 54 052_如果跟Broker的连接还没完成建立,那么会向他发送请求吗
* 55 053_如何通过不断轮询的poll方法完成跟目标Broker的连接
* 56 054_连接建立之后如何获取要发送到每个Broker去的所有Batch
* 57 055_针对每个目标Broker构建一个很多Batch组成的Request
* 58 056_如何将要发送到每个Broker去的Request依托封装组件暂存起来
* 59 057_在不断轮询的万能poll方法中如何基于NIO将请求发送出去
* 60 058_回头看看发送完请求之后是如何让Selector关注OP_READ事件的
* 61 059_工业级网络编程中的NIO实践:基于位运算控制事件的监听
* 62 060_对于已经发送给Broker的请求会进行什么样的后续处理
* 63 061_看看Kafka生产端的NIO编程是如何进行拆包类问题的处理的
* 64 062_对一个Broker如何同时发送出去多个inFilghtRequest
* 65 063_如果Broker返回响应消息,在OP_READ事件中是如何处理的
* 66 064_读取响应时在底层如何通过NIO编程实现数据的读取
* 67 065_工业级NIO编程实践:读取数据遇到粘包类问题怎么处理
* 68 066_工业级NIO编程实践:一条消息无法读完的拆包类问题怎么处理
* 69 067_对刚读取出来的暂存状态的响应消息是如何进行处理的
* 70 068_对于确认读取完毕的响应消息是如何解析二进制字节数组的
* 71 069_如果一个请求被正确处理之后如何调用设置的回调函数
* 72 070_从源码层面看看如果一个请求处理异常会进行什么样的处理
* 73 071_Batch被处理完毕之后是如何释放底层的内存块资源到缓冲池的
* 74 072_深入看看请求处理异常之后的重试机制是如何实现的
* 75 073_重新在内存缓冲里入队的Batch在什么时机下会判定可以重试
* 76 074_对于失败的请求多次重试发送之后的结果又会怎么处理呢
* 77 075_如果一个Batch一直停留在内存缓冲里,如何检测到他的超时
* 78 076_如果一个inFlightRequest一直没有收到响应,如何检测他的超时
* 79 077_KafkaProducer源码精华总结:内存管理、缓存机制、NIO网络通信






