2.2 日志段類解析
類綜述
- LogSegment 類定義
-
Kafka源碼解析之日志段類LogSegment(中)
核心 API
讀寫日志是Kafka最常用的操作,而日志讀取底層調用的就是日志段的這兩個方法。
append(寫消息)
重點關注一下寫操作過程中更新索引的時機是如何設定的。
執行流程
step1
- 先判斷該日志段是否為空,若為空,則Kafka需記錄要寫入消息集的最大時間戳,并将其作為後面新增日志段倒計時的依據。
-
Kafka源碼解析之日志段類LogSegment(中) - step2
-
Kafka源碼解析之日志段類LogSegment(中) - step3
-
Kafka源碼解析之日志段類LogSegment(中)
step4
- 每個日志段都要儲存目前最大時間戳和所屬消息的偏移資訊。
-
Kafka源碼解析之日志段類LogSegment(中) - Broker 端提供有定期删除日志的功能。比如我隻想保留最近 7 天日志,就是基于目前最大時間戳值。
而最大時間戳對應的消息的偏移值則用于時間戳索引項。時間戳索引項儲存時間戳與消息偏移的對應關系。該步驟中,Kafka更新并儲存這組對應關系。
step5
read(讀消息)
關注下Kafka計算待讀取消息位元組數的邏輯,也就是maxSize、maxPosition和startOffset是如何共同影響read方法的。
- 方法簽名
-
Kafka源碼解析之日志段類LogSegment(中)
待确定了讀取起始位置,日志段代碼需要根據這部分資訊以及 maxSize 和 maxPosition 參數共同計算要讀取的總位元組數。舉個例子,假設 maxSize=100,maxPosition=300,startPosition=250,那麼 read 方法隻能讀取 50 位元組,因為 maxPosition - startPosition = 50。我們把它和maxSize參數相比較,其中的最小值就是最終能夠讀取的總位元組數。