天天看點

Kafka源碼解析之日志段類LogSegment(中)

2.2 日志段類解析

類綜述

  • LogSegment 類定義
  • Kafka源碼解析之日志段類LogSegment(中)

核心 API

讀寫日志是Kafka最常用的操作,而日志讀取底層調用的就是日志段的這兩個方法。

append(寫消息)

重點關注一下寫操作過程中更新索引的時機是如何設定的。

執行流程
Kafka源碼解析之日志段類LogSegment(中)

step1

  • 先判斷該日志段是否為空,若為空,則Kafka需記錄要寫入消息集的最大時間戳,并将其作為後面新增日志段倒計時的依據。
  • Kafka源碼解析之日志段類LogSegment(中)
  • step2
  • Kafka源碼解析之日志段類LogSegment(中)
  • step3
  • Kafka源碼解析之日志段類LogSegment(中)

step4

  • 每個日志段都要儲存目前最大時間戳和所屬消息的偏移資訊。
  • Kafka源碼解析之日志段類LogSegment(中)
  • Broker 端提供有定期删除日志的功能。比如我隻想保留最近 7 天日志,就是基于目前最大時間戳值。

而最大時間戳對應的消息的偏移值則用于時間戳索引項。時間戳索引項儲存時間戳與消息偏移的對應關系。該步驟中,Kafka更新并儲存這組對應關系。

step5

Kafka源碼解析之日志段類LogSegment(中)

read(讀消息)

關注下Kafka計算待讀取消息位元組數的邏輯,也就是maxSize、maxPosition和startOffset是如何共同影響read方法的。

  • 方法簽名
  • Kafka源碼解析之日志段類LogSegment(中)
Kafka源碼解析之日志段類LogSegment(中)
Kafka源碼解析之日志段類LogSegment(中)
Kafka源碼解析之日志段類LogSegment(中)

待确定了讀取起始位置,日志段代碼需要根據這部分資訊以及 maxSize 和 maxPosition 參數共同計算要讀取的總位元組數。舉個例子,假設 maxSize=100,maxPosition=300,startPosition=250,那麼 read 方法隻能讀取 50 位元組,因為 maxPosition - startPosition = 50。我們把它和maxSize參數相比較,其中的最小值就是最終能夠讀取的總位元組數。

Kafka源碼解析之日志段類LogSegment(中)

繼續閱讀