Kafka 原理与源码精讲--掘金小册课程推荐/优惠
版权声明
本站非掘金小册官网,与官方无任何关系。我们不提供课程下载或详细内容,仅作为课程分享和推荐平台。我们鼓励大家支持正版,尊重创作者的劳动成果,这样不仅能帮助创作者持续产出优质内容,也能让自己获得更好的学习体验。请通过官方渠道购买和学习课程,感谢您的理解与支持。
课程详情
课程介绍
你能学到什么
- Kafka 实现高吞吐消息的架构原理
- Kafka 实现消息可靠性原理
- Kafka 生产环境如何落地
- 全面学 Kafka 各个组件,系统掌握 Kafka 的原理;
- 系统学习 Kafak 的轮子组件,如内存缓冲池,基于 NIO 的通信模块;
- Kafka 高可靠分布式设计;
- Kafka 底层文件存储设计;
- Kafka 高吞吐架设计在服务端是如何体现的?
- Kafka 如何保证不丢消息及消息不重复的?
- 在生产环境 Kafka 如何落地?
作者介绍
肖恩Sean,京东集团架构师。10 年+ 互联网一线开发经验。先后就职于美团、去哪儿网、京东
等大厂。长期从事基础架构中间件研发,特别对于消息队列有深入理解和实践。参与过自研消息队列中间件的工作,主导了 Raft 协议、消息轨迹、消息队列消费模型的演进等技术点在自研消息队列中间件的落地。同时,对于 Kafka、RocketMQ 等经典消息队列也达到了源码级的理解。
小册介绍
我始终相信学会了有价值的知识
后,你的知识
会在每次实践中不断被利用而创造价值
,而每次的实践
又加深了你对知识的理解,周而复始
,你会越来越厉害。
如果你的学习和工作态度没有问题,那么现在最大的问题就是,什么是有价值的知识
,以及如何学习有价值的知识
。一般情况下,对我们后端技术人员来说,我们需要挑战的领域无非这么几个:
海量网络通信
海量存储
分布式
但是,很少能有一种中间件能把这些领域全部都包含进来,但是消息队列就
是一个。如果要评价一个消息队列是否是有是否是优秀的,那么就要看它在网络通信,存储,分布式上的实现是否优秀
。毫无疑问,KAFKA
在所以消息队列里是最优秀
的,最有设计感
的消息队列系统。把 KAFKA 研究透了,会为你以后的工作打下坚实的基础
。
希望大家能够跟我一起开启这个有意义的小册。
首先,我们看看 从 KAFKA 中能具体学到哪些具体的 有价值的知识
通过学习本小册我们能学到什么呢
1. 可以帮助你对Kafka的内部设计原理有了更深的了解,提升了架构能力和代码的质量
Kafka 可以说是全世界使用最多的消息队列,而且 Kafka 是设计最复杂的消息队列(当然设计复杂并不代表不好用,正好相反它的易用性极高)。 比如下图的生产者架构设计:
我们先简单回顾下Kafka生产者的架构模型特点,以及可能提出的疑问:
- 产生消息的主线程和真正负责网络发送的 Sender 子线程各司其职,于是通过异步解耦实现了生产端的高吞吐,那么主线程和Sender子线程是如何协作的呢?
- 主线程负责把消息放入缓冲区,缓冲区主要由实现 ConcurrentMap 接口的 CopyOnWriteMap 类组成,CopyOnWriteMap 类是 为了保证线程安全自己设计的 map 集合类,那么这个类是如何设计的呢?
- 既然有缓冲区那么就一定会涉及内存的存储,那么为了提高内存的复用减少不必要的 GC,KAFKA 设计了BufferPool,也就是上图最下面的模块,那么这个 BufferPool 是如何设计的呢?
- 如果缓冲区的数据发送失败了,或者发送数据超时了,该如何处理呢? .....,其实根据上面的架构图还能提出很多的问题,大家可以看到,仅仅一个生产者就能有如此多的问题需要我们去探索,那么我们是不是应该真的通过好好理解Kafka的源码,通过理解源码来洞察Kafka的实现思路,为我们以后自己设计类似的功能组件提供思路。
2. 源码级定位线上bug
。快速定位 KAKFA 运行时出现的问题和异常,保证线上 KAFKA 的稳定性
比如,下图是Sender线程发送消息的流程。
在上图的下部的中间位置可以看到一个集合 inFlightRequests,这个集合是一个map类 Map<String, Deque<NetworkClient.InFlightRequest>>,key是 broker 的 broker_id,value 是向这个 broker 发送消息的 Deque 队列。这个队列表示向某个 broker 发送了但是还收到响应的消息,也就是说broker还没处理完这些消息。于是可以这样理解这个 Deque 队列的长度就是某个 broker 对这个生产者发送消息的负载。这个长度是一个参数可以设置,当时由于线上参数设置的比较大达到了100,于是 broker 出现了假死的现象。通过我对源码的了解,我及时把参数调成了默认参数5,才解决了这个问题,可见了解参数是多么的重要。
3. 大幅提高你的代码能力。 下图是主线程并发向缓冲区填充消息的示意图:
- 大家都知道生产者是线程安全的,这样就会造成多个线程并发向缓冲区填充消息,如果保证高并发的同时保证数据不会问题呢?
- 多线程的场景下,缓存区如何高效利用不浪费存储空间呢? 这里面用到了局部锁,重试等设计理念,这在后面章节都会有介绍。这个设计大家完全可以借鉴到自己的高并发系统模块中。
4. 你还能参加 Kafka 开源社区,成为一名代码贡献者(Contributor)。 在社区中,你能够和全世界的 Kafka 源码贡献者协同工作,彼此分享交流,想想就是一件很有意思的事情。特别是当你的代码被社区采纳之后,全世界的 Kafka 使用者都会使用你写的代码。这简直太让人兴奋了,不是吗?总而言之,阅读源码的好处真的很多,既能精进代码功力,又能锤炼架构技巧,还能高效地解决实际问题,有百利而无一害。
我们这节课的特点:
- 对关键代码都有详细的解读,注释会非常详细;
- 对一些流程较多的代码流程,我会给大家画出流程图有利于大家的理解;
- 对每篇文章我都有对应的视频教学(作者个人免费提供,现在视频已经更新完成了生产者),让大家更好的理解。下面提供几个视频链接,大家可以先睹为快: 消息在缓冲区时如何存储的?
整个知识体系你可以参考下面的知识导图:
免费视频讲解
同时,本小册在文本文章的基础上给大家提供了视频讲解
,而且讲解内容不仅包含源码,也会给大家详细介绍 KAFKA 的设计精髓,现在已经更新到生产者,纯粹是作者本人的额外贡献,如果有兴趣可以关注下面的B站主页,包含所有相关的视频教学内容:
https://space.bilibili.com/391958110
视频免费试看
:
生产者如何获取元数据?https://www.bilibili.com/video/BV1ZT4y167Jg
消息在缓冲区是如何存储的?https://www.bilibili.com/video/BV1cZ4y1y7C5
客户端网络通信如何实现的?https://www.bilibili.com/video/BV1eR4y1w7Pa
同时,每篇文章对应的视频都已在文章一开始注明,方便大家学习交流
适宜人群
普通业务工程师
:通过对 KAFKA 的架构和源码的理解能够更好地使用 KAFKA,甚至对 Kafka 做针对性的调优。Kafka 运维人员
:通过 KAFKA 从架构设计到源码的学习,可以更好地提升 KAFKA 运维人员对 KAFKA 整体架构的认知,有利于运维人员及时发现问题和解决问题。基础架构中间件工程师
:拓展知识面,扩大认知。KAFKA 是一个设计非常经典的中间件,无论是经典的架构设计还是代码设计,都是很值得从事中间件设计工作的工程师借鉴学习的。
课程目录
- 技术选型:为什么互联网大厂都爱用 Kafka?
- 挑战生产者设计的复杂度:生产者业务流程
- 真正的发送消息 : Sender线程
- 高吞吐利器之一:生产者缓冲区
- 两个完美轮子:Buffer的池化和 CopyOnWriteMap
- 生产端缓冲区总结 : 缓冲区处理消息流程
- 客户端的通信能力:客户端网络通信组件
- 有的放矢:生产者的元数据
- 对NIO的优雅封装(下):封装 Selector
- 对NIO的优雅封装(上):封装SocketChannel、Buffer
- 消费者的通信:消费者网络通信层
- 步调一致:消费者协调器
- 消费者挂了怎么办?消费组重平衡(上)
- 消费者挂了怎么办?消费组重平衡(下)
- 消费者从哪里消费:消费者订阅状态和 offset 操作
- 服务端的核心:SocketServer 类和 Reactor 模式简介
- 消费者如何消费消息:消费者拉取数据的方法
- 消费者总结:整体流程是怎样的?
- 分而治之:网络层 Reactor 设计模型
- 完美的服务端网络层设计:服务端网络层总结
- 完美的服务端网络层设计 :RequestChannel 类、KafkaRequestHandler 类和 KafkaApis 类
- Message 家的功能:日志操作的核心方法
- 简介 Message 的家 :存储层简介和日志读写的大体流程
- Message 的家是什么样?:日志分段文件与索引文件
- Message 的家是什么样?:文件存储介绍和日志分段管理
- Message 的家规:日志管理
- 多重影子:副本管理
- Kafka 生产环境落地:Kafka 使用规范
- Kafka 生产者的吞吐量为啥这么高
- 可靠性设计:Kafka 是如何做到消息不丢或不重复的?
- 架构设计总结:Kafka 架构深入解析
- Kafka 副本一致性深入理解|LEO,ISR,HW ,leader epoch
- 高吞吐设计:Kafka 高吞吐架设计在服务端是如何体现的?