Kafka科普系列 | 什么是LSO?
歡迎跳轉到本文的原文鏈接:https://honeypps.com/mq/kafka-basic-knowledge-of-lso/
很多同學對于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的位置)。
這個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》一書中若干篇幅。
歡迎跳轉到本文的原文鏈接:https://honeypps.com/mq/kafka-basic-knowledge-of-lso/
歡迎支持筆者新作:《深入理解Kafka:核心設計與實踐原理》和《RabbitMQ實戰指南》,同時歡迎關注筆者的微信公眾號:朱小廝的博客。
總結
以上是生活随笔為你收集整理的Kafka科普系列 | 什么是LSO?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Kafka科普系列 | 什么是LW和lo
- 下一篇: Kafka科普系列 | 轻松理解Kafk