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

24 | ReplicaManager(中):副本管理器是如何读写副本的?

你好,我是胡夕。上节课,我们学习了 ReplicaManager 类的定义和重要字段,今天我们接着学习这个类中的读写副本对象部分的源码。无论是读取副本还是写入副本,都是通过底层的 Partition 对象完成的,而这些分区对象全部保存在上节课所学的 allPartitions 字段中。可以说,理解这些字段的用途,是后续我们探索副本管理器类功能的重要前提。
现在,我们就来学习下副本读写功能。整个 Kafka 的同步机制,本质上就是副本读取 + 副本写入,搞懂了这两个功能,你就知道了 Follower 副本是如何同步 Leader 副本数据的。

副本写入:appendRecords

所谓的副本写入,是指向副本底层日志写入消息。在 ReplicaManager 类中,实现副本写入的方法叫 appendRecords。
放眼整个 Kafka 源码世界,需要副本写入的场景有 4 个。
场景一:生产者向 Leader 副本写入消息;
场景二:Follower 副本拉取消息后写入副本;
场景三:消费者组写入组信息;
场景四:事务管理器写入事务信息(包括事务标记、事务元数据等)。
除了第二个场景是直接调用 Partition 对象的方法实现之外,其他 3 个都是调用 appendRecords 来完成的。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Kafka副本管理器是Kafka核心组件之一,负责处理副本的读写操作。通过分析ReplicaManager类的源码,我们了解到副本的读写操作是通过底层的Partition对象完成的,而这些分区对象都保存在allPartitions字段中。理解这些字段的用途对于后续探索副本管理器类的功能至关重要。副本的读写功能是Kafka同步机制的核心,对于了解Follower副本如何同步Leader副本数据至关重要。通过学习副本管理器的源码,我们可以深入了解Kafka中副本的读写功能,从而更好地理解Kafka的同步机制。 在文章中,我们深入分析了副本写入的方法appendRecords,该方法实现了向副本底层日志写入消息的功能。我们详细解释了该方法的输入参数和执行流程,以及其中涉及的重要步骤。另外,我们还介绍了appendToLocalLog方法,用于将消息集合写入副本的本地日志,以及delayedProduceRequestRequired方法,用于判断消息集合写入后是否需要等待其他副本完成写入。通过这些分析,读者可以深入了解Kafka中副本写入的实现细节和相关判断逻辑。 另外,我们还学习了fetchMessages方法,该方法负责从副本读取消息。我们详细解释了该方法的输入参数和执行流程,以及其中涉及的读取本地日志和构建Response的过程。通过这些分析,读者可以深入了解Kafka中副本读取的实现细节和相关判断逻辑。 总的来说,本文通过深入剖析Kafka副本管理器的源码,帮助读者全面了解了Kafka中副本的读写功能和同步机制,为读者深入理解Kafka的内部工作原理提供了重要参考。

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

全部留言(5)

  • 最新
  • 精选
  • 胡夕
    置顶
    你好,我是胡夕。我来公布上节课的“课后讨论”题答案啦~ 上节课,我们重点学习了ReplicaManager类的类定义和核心字段。课后我请你自行写一个统计Online状态分区数的方法。我的代码如下: private def onlinePartitionCount: Int = { allPartitions.values.iterator.count(_ == HostedPartition.Online) } okay,你同意这个说法吗?或者说你有其他的看法吗?我们可以一起讨论下。
    2020-06-23
    2
  • Kvicii.Y
    场景二:Follower 副本拉取消息后写入副本不调用appendRecords;这样origin 值不就只可能是 Client 或 Coordinator了吗

    作者回复: 其他写入方法也需要传入origin,比如Log的append方法。在那里指定了origin=Replication

    2020-07-15
  • 云端漫漫步
    origin是标识消息来源的,在写入向Leader写入本地日志时候层层传递,最终在analyzeAndValidateRecords中使用; 作用是根据origin的值,判断消息格式是否合法:如果是AppendOrigin.Client,消息格式Version 2,且起始batch位移值不为0,抛出InvalidRecordException;
    2020-07-10
    1
  • z.l
    这里的requiredAcks就是参数request.required.acks的值吗?如果是的话,request.required.acks=-1需要等待其他broker上的副本写入完成才能返回写入成功,这块逻辑在哪里啊?
    2022-09-15归属地:上海
  • 梁聪明
    origin表示写入方来源,在写入日志之前,需要对不同的写入方做不同程度的校验 例如,client的需要做full validation:producerEpoch+appendFirstSeq+offset
    2020-09-02
收起评论
显示
设置
留言
5
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部