作者:朱小厮 來源:公衆号朱小厮的博客
很多同學對于Kafka的認知僅限于在LEO和HW之間,有可能認知還出現錯誤,對此記住一點,這兩個都是指最後一條的下一條的位置而不是指最後一條的位置。不過本文的關注點不在于此,而在于LSO這個概念。如果需要了解LEO和HW的同學可在文末留言,後面也可以考慮出個科普LEO和HW的文章。
LSO特指LastStableOffset,在上一篇《Kafka科普系列 | 什麼是LW和logStartOffset?》中提及過這個概念,它具體的與Kafka的事務有關。
可能大家在使用Kafka的時候并沒有太在意一個消費端的參數——isolation.level,這個參數用來配置消費者的事務隔離級别。字符串類型,有效值為“read_uncommitted”和 “read_committed”,表示消費者所消費到的位置,如果設置為“read_committed”,那麼消費者就會忽略事務未提交的消息,即隻能消費到 LSO(LastStableOffset)的位置,默認情況下為 “read_uncommitted”,即可以消費到 HW(High Watermark)處的位置。注意:follower副本的事務隔離級别也為“read_uncommitted”,并且不可修改。
對于Kafka中事務的講解會在後面的系列文章《Kafka科普系列 | 什麼是Kafka的事務?》中進行解答,在這裡隻需了解:在開啟Kafka事務時,生産者發送了若幹消息(比如msg1、msg2、msg3)到broker中,如果生産者沒有提交事務(執行commitTransaction),那麼對于isolation.level = read_committed的消費者而言是看不到這些消息的,而isolation.level = read_uncommitted則可以看到。事務中的第一條消息的位置可以标記為firstUnstableOffset(也就是msg1的位置)。
在圖中,對每一個分區而言,它的 Lag 等于 HW – ConsumerOffset 的值,其中 ConsumerOffset 表示當前的消費位移。當然這隻是針對普通的情況。如果為消息引入了事務,那麼 Lag 的計算方式就會有所不同。
如果消費者客戶端的 isolation.level 參數配置為“read_uncommitted”(默認),那麼 Lag的計算方式不受影響;如果這個參數配置為“read_committed”,那麼就要引入 LSO 來進行計 算了。
對未完成的事務而言,LSO 的值等于事務中第一條消息的位置(firstUnstableOffset,如上圖所示),對已完成的事務而言,它的值同 HW 相同, 所以我們可以得出一個結論:LSO≤HW≤LEO。(如下圖所示)
所以,對于分區中有未完成的事務,并且消費者客戶端的 isolation.level 參數配置為“read_committed”的情況,它對應的 Lag 等于 LSO – ConsumerOffset 的值。
這個知識點的掌握也能夠為你在面試環節中加分。大多數情況下,除非面試官是專門做Kafka相關的開發工作,一般很少有人會關注LSO這個東西,也就是說大概率情況下面試官也不知道這是什麼。“什麼是Kafka Lag,怎麼計算Kafka Lag”類似這種問題反而會被經常問及,那麼你在回答完HW - ConsumedOffset=Lag之後,如果再接着補上LSO的内容,相信面試官會為之眼前一亮。
來源:本文修改自《深入理解Kafka》一書中若幹篇幅。,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!