2.2 日志段类解析
类综述
- LogSegment 类定义
核心 API
读写日志是Kafka最常用的操作,而日志读取底层调用的就是日志段的这两个方法。
append(写消息)
重点关注一下写操作过程中更新索引的时机是如何设定的。
执行流程
step1
- 先判断该日志段是否为空,若为空,则Kafka需记录要写入消息集的最大时间戳,并将其作为后面新增日志段倒计时的依据。
- step2
- step3
step4
- 每个日志段都要保存当前最大时间戳和所属消息的偏移信息。
- Broker 端提供有定期删除日志的功能。比如我只想保留最近 7 天日志,就是基于当前最大时间戳值。
而最大时间戳对应的消息的偏移值则用于时间戳索引项。时间戳索引项保存时间戳与消息偏移的对应关系。该步骤中,Kafka更新并保存这组对应关系。
step5
read(读消息)
关注下Kafka计算待读取消息字节数的逻辑,也就是maxSize、maxPosition和startOffset是如何共同影响read方法的。
- 方法签名
执行流程
step1
step2
待确定了读取起始位置,日志段代码需要根据这部分信息以及 maxSize 和 maxPosition 参数共同计算要读取的总字节数。举个例子,假设 maxSize=100,maxPosition=300,startPosition=250,那么 read 方法只能读取 50 字节,因为 maxPosition - startPosition = 50。我们把它和maxSize参数相比较,其中的最小值就是最终能够读取的总字节数。
step3