1. 程式人生 > >漲姿勢瞭解一下Kafka消費位移可好?

漲姿勢瞭解一下Kafka消費位移可好?

摘要:Kafka中的位移是個極其重要的概念,因為資料一致性、準確性是一個很重要的語義,我們都不希望訊息重複消費或者丟失。而位移就是控制消費進度的大佬。本文就詳細聊聊kafka消費位移的那些事,包括: ![](https://img2020.cnblogs.com/other/2027276/202006/2027276-20200616214636333-107611628.png) # 概念剖析 ### kafka的兩種位移 關於位移(Offset),其實在kafka的世界裡有兩種位移: - 分割槽位移:生產者向分割槽寫入訊息,每條訊息在分割槽中的位置資訊由一個叫offset的資料來表徵。假設一個生產者向一個空分割槽寫入了 10 條訊息,那麼這 10 條訊息的位移依次是 0、1、…、9; - 消費位移:消費者需要記錄消費進度,即消費到了哪個分割槽的哪個位置上,這是消費者位移(Consumer Offset)。 注意,這和上面所說的訊息在分割槽上的位移完全不是一個概念。上面的“位移”表徵的是分割槽內的訊息位置,它是不變的,即一旦訊息被成功寫入到一個分割槽上,它的位移值就是固定的了。而消費者位移則不同,它可能是隨時變化的,畢竟它是消費者消費進度的指示器。 ### 消費位移 消費位移,記錄的是 Consumer 要消費的下一條訊息的位移,**切記,是下一條訊息的位移!** 而不是目前最新消費訊息的位移 假設一個分割槽中有 10 條訊息,位移分別是 0 到 9。某個 Consumer 應用已消費了 5 條訊息,這就說明該 Consumer 消費了位移為 0 到 4 的 5 條訊息,此時 Consumer 的位移是 5,指向了下一條訊息的位移。 至於為什麼要有消費位移,很好理解,當 Consumer 發生故障重啟之後,就能夠從 Kafka 中讀取之前提交的位移值,然後從相應的位移處繼續消費,從而避免整個消費過程重來一遍。就好像書籤一樣,需要書籤你才可以快速找到你上次讀書的位置。 那麼瞭解了位移是什麼以及它的重要性,我們自然而然會有一個疑問,kafka是怎麼記錄、怎麼儲存、怎麼管理位移的呢? # 位移的提交 Consumer 需要上報自己的位移資料,這個彙報過程被稱為位移提交。因為 Consumer 能夠同時消費多個分割槽的資料,所以位移的提交實際上是在分割槽粒度上進行的,即Consumer 需要為分配給它的每個分割槽提交各自的位移資料。 鑑於位移提交甚至是位移管理對 Consumer 端的巨大影響,KafkaConsumer API提供了多種提交位移的方法,每一種都有各自的用途,這些都是本文將要談到的方案。 ```java void commitSync(Duration timeout); void commit