Kafka 核心源码解读
胡夕
Apache Kafka Committer,老虎证券技术总监
19216 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 44 讲
结束语 (1讲)
Kafka 核心源码解读
15
15
1.0x
00:00/00:00
登录|注册

22 | ReplicaFetcherThread:Follower如何拉取Leader消息?

你好,我是胡夕。今天,我们继续学习 Follower 是如何拉取 Leader 消息的。
要弄明白这个问题,在学习源码的时候,我们需要从父类 AbstractFetcherThread 开始学起,因为这是理解子类 ReplicaFetcherThread 的基础。上节课,我们已经学习了 AbstractFetcherThread 的定义,以及 processPartitionData、truncate、buildFetch 这三个方法的作用。现在,你应该掌握了拉取线程源码的处理逻辑以及支撑这些逻辑实现的代码结构。
不过,在上节课的末尾,我卖了个关子——我把串联起这三个方法的 doWork 方法留到了今天这节课。等你今天学完 doWork 方法,以及这三个方法在子类 ReplicaFetcherThread 中的实现代码之后,你就能完整地理解 Follower 副本应用拉取线程(也就是 ReplicaFetcherThread 线程),从 Leader 副本获取消息并处理的流程了。
那么,现在我们就开启 doWork 以及子类 ReplicaFetcherThread 代码的阅读。

AbstractFetcherThread 类:doWork 方法

doWork 方法是 AbstractFetcherThread 类的核心方法,是线程的主逻辑运行方法,代码如下:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入剖析了ReplicaFetcherThread的实现原理,重点介绍了Follower副本应用拉取线程的流程。通过对doWork方法和相关方法的逐步介绍,读者能够完整地理解ReplicaFetcherThread的执行过程。文章首先解释了AbstractFetcherThread类的doWork方法,详细讲解了副本截断操作和消息获取操作的重要性。接着,对maybeTruncate方法和maybeFetch方法的实现逻辑进行了详细解读,包括截断操作的实现原理和消息获取的核心逻辑。此外,文章还提供了代码片段和流程图,帮助读者更好地理解ReplicaFetcherThread的执行过程。 总之,本文以技术解读的方式,为想要深入了解Follower如何拉取Leader消息的读者提供了具有指导意义的文章。ReplicaFetcherThread类的定义和字段,以及重要方法processPartitionData、buildFetch和truncate也得到了详细解读。文章通过流程图和代码片段的方式,使读者更容易理解这些方法的实现逻辑。文章内容还涉及了truncate方法的实现,以及对AbstractFetcherThread线程的doWork方法的总结,强调了拉取线程的工作入口方法和其子类ReplicaFetcherThread类的重要性。整体而言,本文为读者提供了深入了解ReplicaFetcherThread的机会,使其能够全面理解Follower副本如何实时从Leader副本拉取消息并写入到本地日志,实现与Leader副本之间的同步。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Kafka 核心源码解读》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(10)

  • 最新
  • 精选
  • 胡夕
    置顶
    你好,我是胡夕。我来公布上节课的“课后讨论”题答案啦~ 上节课,我们重点学习了DelayedOperation类源码以及Broker是如何处理延时请求的。课后我请你简单描述下handlePartitionsWithErrors方法的实现原理。我的看法是这样的:这个方法接收一组分区,为它们调用delayPartitions方法执行延时处理。delayPartitions方法会遍历每个给定的分区,并把这些分区依次加入到待读取分区列表的末端,从而实现延时重试操作。简单来说,Kafka处理出错分区的思路就是将这些分区放入到轮询名单的末尾期待稍后重试。 okay,你同意这个说法吗?或者说你有其他的看法吗?我们可以一起讨论下。
    2020-06-23
    3
  • 在路上
    图片里的房子我看了十分钟,这得学多少 kafka 才能拥有啊?

    作者回复: 阁下脑回路真是新奇,“害的”我也看了半天图片:)

    2020-11-06
    3
  • 伯安知心
    updateFetchOffsetAndMaybeMarkTruncationComplete方法只有在truncateToEpochEndOffsets和truncateToHighWatermark中结尾执行,简单来说就是truncate之后,更新标记截断完成,更新partitionStates值,如果它们的offsetTruncationState指示截断已完成,则可能将它们标记为截断已完成

    作者回复: 👍

    2020-06-16
    1
  • 您好 这块有个小问题想咨询一下 就是有没有参数去控制 consumer的fetch频率 replica的fetch频率

    作者回复: Replica这端有两个参数可以使用:leader.replication.throttled.rate和follower.replication.throttled.rate Consumer端可以自己控制啊,比如人为地增加sleep等

    2020-08-14
  • Geek_5258f8
    老师,复制leader的消息,pagecahe中的会复制吗?如果是,是不是存在一个消息某一时刻所有副本都在pagecache中?
    2023-09-21归属地:江苏
    1
  • 张子涵
    // 循环遍历所有分区,更新它们的取值偏移量,如果它们的offsetTruncationState表示截断完成,可以将它们标记为截断完成 private def updateFetchOffsetAndMaybeMarkTruncationComplete(fetchOffsets: Map[TopicPartition, OffsetTruncationState]): Unit = { val newStates: Map[TopicPartition, PartitionFetchState] = partitionStates.partitionStateMap.asScala .map { case (topicPartition, currentFetchState) => val maybeTruncationComplete = fetchOffsets.get(topicPartition) match { case Some(offsetTruncationState) => val state = if (offsetTruncationState.truncationCompleted) Fetching else Truncating PartitionFetchState(offsetTruncationState.offset, currentFetchState.lag, currentFetchState.currentLeaderEpoch, currentFetchState.delay, state) case None => currentFetchState } (topicPartition, maybeTruncationComplete) } partitionStates.set(newStates.asJava) } ps(一边听着老师的语音一边看文档,更能提高注意力,后面的同学们可以尝试一下!)
    2020-08-28
    1
  • linying
    很多地方讲的都是不清楚,稀里糊涂的
    2023-07-21归属地:广东
  • Geek_3f38ee
    当分区存在 Leader Epoch 值时,源码会将副本的本地日志截断到 Leader Epoch 对应的最新位移值处,即方法 truncateToEpochEndOffsets 的逻辑实现; 老师请教下,不是每个分区都会有leader epoch值, 当leader变化epoch值会发生变化吗, 那为什么会有分区不存在 Leader Epoch呢
    2023-03-09归属地:北京
  • surprise
    想问下如果是ack=all的情况下,还需要isr中的副本去leader拉取数据么,这里是不是也不需要写入本地日志了,因为发送的时候制定ack=all已经确认写入了isr中的副本
    2023-01-07归属地:北京
  • 梁聪明
    updateFetchOffsetAndMaybeMarkTruncationComplete方法:更新已经完成截断的分区状态为Fetching
    2020-08-31
收起评论
显示
设置
留言
10
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部