智慧并不产生于学历,而是来自对于知识的终生不懈的追求。这篇文章主要讲述#yyds干货盘点# 滴滴二面:Kafka是如何读写副本消息的?相关的知识,希望能为你提供帮助。
无论是读取副本还是写入副本,都是通过底层的Partition对象完成的,而这些分区对象全部保存在上节课所学的allPartitions字段中。可以说,理解这些字段的用途,是后续我们探索副本管理器类功能的重要前提。现在,我们就来学习下副本读写功能。整个Kafka的同步机制,本质上就是副本读取+副本写入,搞懂了这两个功能,你就知道了Follower副本是如何同步Leader副本数据的。
appendRecords-副本写入向副本底层日志写入消息的逻辑就实现在ReplicaManager#appendRecords。Kafka需副本写入的场景:
- 生产者向Leader副本写入消息
- Follower副本拉取消息后写入副本
- 消费者组写入组信息
- 事务管理器写入事务信息(包括事务标记、事务元数据等)
appendRecords向副本日志写入消息的过程:
执行流程可见,appendRecords:
- 实现消息写入的方法是appendToLocalLog
- 判断是否需要等待其他副本写入的方法delayedProduceRequestRequired
delayedProduceRequestRequired判断消息集合被写入到日志之后,是否需要等待其它副本也写入成功:
private def delayedProduceRequestRequired(
requiredAcks: Short,
entriesPerPartition: Map[TopicPartition, MemoryRecords],
localProduceResults: Map[TopicPartition, LogAppendResult]): Boolean =
requiredAcks == -1 & & entriesPerPartition.nonEmpty & &
localProduceResults.values.count(_.exception.isDefined) < entriesPerPartition.size
若等待其他副本的写入,须同时满足:
- requiredAcks==-1
- 依然有数据尚未写完
- 至少有一个分区的消息,已成功被写入本地日志
副本读取:fetchMessagesReplicaManager#fetchMessages负责读取副本数据。无论:
- java消费者API
- Follower副本
整个方法分为:
读取本地日志
首先判断,读取消息的请求方,就能确定可读取的范围了。fetchIsolation,读取隔离级别:
- 对Follower副本,它能读取到Leader副本LEO值以下的所有消息
- 普通Consumer,只能“看到”Leader副本高水位值以下的消息
根据读取结果确定Response
根据上一步读取结果创建对应Response:
根据上一步得到的读取结果,统计可读取的总字节数,然后判断此时是否能够立即返回Reponse。副本管理器读写副本的两个方法appendRecords和fetchMessages本质上在底层分别调用Log的append和read方法,以实现本地日志的读写操作。完成读写操作后,这两个方法还定义了延时处理的条件。一旦满足延时处理条件,就交给对应Purgatory处理。从这俩方法可见单个组件融合一起的趋势。虽然我们学习单个源码文件的顺序是自上而下,但串联Kafka主要组件功能的路径却是自下而上。如副本写入操作,日志对象append方法被上一层的Partition对象中的方法调用,而后者又进一步被副本管理器中的方法调用。我们按自上而下阅读了副本管理器、日志对象等单个组件的代码,了解了各自的独立功能。现在开始慢慢地把它们融合一起,构建Kafka操作分区副本日志对象的完整调用路径。同时采用这两种方式来阅读源码,就能更高效弄懂Kafka原理。
总结Kafka副本状态机类ReplicaManager读写副本的核心方法:
- appendRecords:向副本写入消息,利用Log#append方法和Purgatory机制实现Follower副本向Leader副本获取消息后的数据同步操作
- fetchMessages:从副本读取消息,为普通Consumer和Follower副本所使用。当它们向Broker发送FETCH请求时,Broker上的副本管理器调用该方法从本地日志中获取指定消息
推荐阅读
- 华为策略路由应用案例
- #yyds干货盘点#分布式服务追踪Spring Cloud Sleuth
- 谷歌大神Jeff Dean领衔,万字展望5大AI趋势
- #yyds干货盘点#会话管理
- XP系统右键怎样像win7一样添加“管理员取得所有权”的容易办法
- XP迅速关闭多个窗口的3种办法窍门
- xp如何在word中就能输入破折号的多种办法
- XP中的IE总是出现运行时间出错怎样处理
- XP经常提示无法定位程序输入点动态链接库怎样处理处理