Kafka核心源码解读
胡夕
Apache Kafka Committer,老虎证券技术总监
新⼈⾸单¥19.9
4057 人已学习
课程目录
已完结 44 讲
0/4登录后,你可以任选4讲全文学习。
课前必学 (3讲)
开篇词 | 阅读源码,逐渐成了职业进阶道路上的“必选项”
免费
导读 | 构建Kafka工程和源码阅读环境、Scala语言热身
重磅加餐 | 带你快速入门Scala语言
日志模块 (5讲)
01 | 日志段:保存消息文件的对象是怎么实现的?
02 | 日志(上):日志究竟是如何加载日志段的?
03 | 日志(下):彻底搞懂Log对象的常见操作
04 | 索引(上):改进的二分查找算法在Kafka索引的应用
05 | 索引(下):位移索引和时间戳索引的区别是什么?
请求处理模块 (5讲)
06 | 请求通道:如何实现Kafka请求队列?
07 | SocketServer(上):Kafka到底是怎么应用NIO实现网络通信的?
08 | SocketServer(中):请求还要区分优先级?
09 | SocketServer(下):请求处理全流程源码分析
10 | KafkaApis:Kafka最重要的源码入口,没有之一
Controller模块 (5讲)
11 | Controller元数据:Controller都保存有哪些东西?有几种状态?
12 | ControllerChannelManager:Controller如何管理请求发送?
13 | ControllerEventManager:变身单线程后的Controller如何处理事件?
14 | Controller选举是怎么实现的?
15 | 如何理解Controller在Kafka集群中的作用?
状态机模块 (3讲)
16 | TopicDeletionManager: Topic是怎么被删除的?
17 | ReplicaStateMachine:揭秘副本状态机实现原理
18 | PartitionStateMachine:分区状态转换如何实现?
延迟操作模块 (2讲)
19 | TimingWheel:探究Kafka定时器背后的高效时间轮算法
20 | DelayedOperation:Broker是怎么延时处理请求的?
副本管理模块 (6讲)
21 | AbstractFetcherThread:拉取消息分几步?
22 | ReplicaFetcherThread:Follower拉取Leader消息是如何实现的?
23 | ReplicaManager(上):必须要掌握的副本管理类定义和核心字段
24 | ReplicaManager(中):副本管理器是如何读写副本的?
25 | ReplicaManager(下):副本管理器是如何管理副本的?
26 | MetadataCache:Broker是怎么异步更新元数据缓存的?
消费者组管理模块 (7讲)
27 | 消费者组元数据(上):消费者组都有哪些元数据?
28 | 消费者组元数据(下):Kafka如何管理这些元数据?
29 | GroupMetadataManager:组元数据管理器是个什么东西?
30 | GroupMetadataManager:位移主题保存的只是位移吗?
31 | GroupMetadataManager:查询位移时,不用读取位移主题?
32 | GroupCoordinator:在Rebalance中,Coordinator如何处理成员入组?
33 | GroupCoordinator:在Rebalance中,如何进行组同步?
特别放送 (5讲)
特别放送(一)| 经典的Kafka学习资料有哪些?
特别放送(二)| 一篇文章带你了解参与开源社区的全部流程
特别放送(三)| 我是怎么度过日常一天的?
特别放送(四)| 20道经典的Kafka面试题详解
特别放送(五) | Kafka 社区的重磅功能:移除 ZooKeeper 依赖
期中、期末测试 (2讲)
期中测试 | 这些源码知识,你都掌握了吗?
期末测试 | 一套习题,测试你的掌握程度
结束语 (1讲)
结束语 | 源码学习,我们才刚上路呢
Kafka核心源码解读
15
15
1.0x
00:00/00:00
登录|注册

10 | KafkaApis:Kafka最重要的源码入口,没有之一

胡夕 2020-05-09
你好,我是胡夕。今天,我们来收尾 Kafka 请求处理模块的源码学习。讲到这里,关于整个模块,我们还有最后一个知识点尚未掌握,那就是 KafkaApis 类。
在上节课中,我提到过,请求的实际处理逻辑是封装在 KafkaApis 类中的。你一定很想知道,这个类到底是做什么的吧。
实际上,我一直认为,KafkaApis 是 Kafka 最重要的源码入口。因为,每次要查找 Kafka 某个功能的实现代码时,我们几乎总要从这个 KafkaApis.scala 文件开始找起,然后一层一层向下钻取,直到定位到实现功能的代码处为止。比如,如果你想知道创建 Topic 的流程,你只需要查看 KafkaApis 的 handleCreateTopicsRequest 方法;如果你想弄懂 Consumer 提交位移是怎么实现的,查询 handleOffsetCommitRequest 方法就行了。
除此之外,在这一遍遍的钻取过程中,我们还会慢慢地掌握 Kafka 实现各种功能的代码路径和源码分布,从而建立起对整个 Kafka 源码工程的完整认识
如果这些还不足以吸引你阅读这部分源码,那么,我再给你分享一个真实的案例。
之前,在使用 Kafka 时,我发现,Producer 程序一旦向一个不存在的主题发送消息,在创建主题之后,Producer 端会抛出一个警告:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Kafka核心源码解读》,如需阅读全部文章,
请订阅文章所属专栏新⼈⾸单¥19.9
立即订阅
登录 后留言

精选留言(8)

  • 胡夕 置顶
    你好,我是胡夕。我来公布上节课的“课后讨论”题答案啦~

    上节课,咱们重点了解了请求处理的全流程。课后我请你思考这样一个问题,即请求处理流程的哪些部分应用了经典的“生产者 - 消费者”模式。其实在Kafka的网路通信层,请求队列和响应队列都应用了生产者-消费者模式。请求队列的生产者是Processor线程,消费者是KafkaRequestHandler线程;响应队列的生产者是KafkaRequestHandler线程,而Processor线程是消费者。

    okay,你同意这个说法吗?或者说你有其他的看法吗?我们可以一起讨论下。
    2020-05-19
  • 张子涵
    个人觉得答案应该在handleOffsetCommitRequest 方法中,比较贴近的应该是这一段
      // reject the request if not authorized to the group
        if (!authorize(request, READ, GROUP, offsetCommitRequest.data.groupId)) {
          val error = Errors.GROUP_AUTHORIZATION_FAILED
          val responseTopicList = OffsetCommitRequest.getErrorResponseTopics(
            offsetCommitRequest.data.topics,
            error)

          sendResponseMaybeThrottle(request, requestThrottleMs => new OffsetCommitResponse(
            new OffsetCommitResponseData()
                .setTopics(responseTopicList)
                .setThrottleTimeMs(requestThrottleMs)
          )) 如果没有授权给组,则拒绝请求

    作者回复: ������

    2020-08-21
    1
  • 懂码哥(GerryWen)
    胡总,我们目前生产版本是2.1.0,遇到一个比较严重也比较紧急问题,希望您能帮忙分析一下是不是版本问题。 很奇怪的现象就是重启某个有问题的broker就正常了,但是维持不到八个小时,又出问题了。
    我把jira贴一下,你帮我看下,是否有人遇到同样问题问你。看jira回答,是在2.1.1版本修复了。
    https://issues.apache.org/jira/browse/KAFKA-7697
    https://issues.apache.org/jira/browse/KAFKA-7870
    https://issues.apache.org/jira/browse/KAFKA-6582
    谢谢谢谢谢谢!

    作者回复: 信息量太少了,光说是一个奇怪的问题,没有日志和相关描述很难判断啊:(

    快速验证的话不妨升级到2.1.1试试呢

    2020-07-08
    1
    1
  • 鲁·本
    if (!authorize(request.context, READ, GROUP, offsetCommitRequest.data.groupId)) {
    需要消费者组有读权限

    作者回复: ������

    2020-08-27
  • 曾轼麟
    提交位移在handleOffsetCommitRequest方法中,需要判断当前发起commitRequest的Consumer对这个group是否有读权限

    作者回复: 是的~

    2020-05-31
  • 空知
    有 READ权限就可以了~~

    作者回复: 能确定所在代码吗:)

    2020-05-14
    1
  • 伯安知心
    我看的kafka版本0.9中提交consumer位移在handleoffsetcommitrequest方法中,执行authorize验证在simpleaclauthorizer类map中是否包含这个用户,如果有则验证通过。

    作者回复: 是的,是否能再进一步,看看它需要什么权限?

    2020-05-10
    1
  • 欧阳
    老师,你好。学习kafka很容易想到raft,理论上很多近似和相同的地方。我的问题是:在实际生产环境中,需要搭建跨地域的集群,保证一致性是不是根本就不太可行?集群随时都有可能脑裂?isr集合一直变来变去。
    如果不能跨地域的话,异地多中心的数据如何保证一致性呢?

    作者回复: 一般采用多套Kafka集群+异步同步的方式

    2020-05-09
收起评论
8
返回
顶部