可能大家在使用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的位置)。
這個lso還會影響kafka消費滯後量(也就是kafka lag,很多時候也會被稱之為訊息堆積量)的計算。不妨我們先來看一下下面這幅圖。
在圖中,對每乙個分割槽而言,它的 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科普系列Kafka中的事務是什麼樣子的
inittransactions 方法用來初始化事務 begintransaction 方法用來開啟事務 sendoffsetstotransaction 方法為消費者提供在事務內的位移提交的操作 committransaction 方法用來提交事務 aborttransaction 方法用來中止事...
Kafka科普系列Kafka中的事務是什麼樣子的
inittransactions 方法用來初始化事務 begintransaction 方法用來開啟事務 sendoffsetstotransaction 方法為消費者提供在事務內的位移提交的操作 committransaction 方法用來提交事務 aborttransaction 方法用來中止事...
kafka系列4 什麼是kafka
關於什麼是kafka,看過乙個簡單例子。舉個例子,生產者消費者,生產者生產雞蛋,消費者消費雞蛋,生產者生產乙個雞蛋,消費者就消費乙個雞蛋,假設消費者消費雞蛋的時候噎住了 系統宕機了 生產者還在生產雞蛋,那新生產的雞蛋就丟失了。再比如生產者很強勁 大交易量的情況 生產者1秒鐘生產100個雞蛋,消費者1...