漲姿勢瞭解一下Kafka消費位移可好?
阿新 • • 發佈:2020-06-17
摘要: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