在 Kafka 中無論是 producer 往 topic 中寫數據, 還是 consumer 從 topic 中讀數據, 都避免不了和 offset 打交道, 關於 offset 主要有以下幾個概念。
- Last Committed Offset:consumer group 最新一次 commit 的 offset,表示這個 group 已經把 Last Committed Offset 之前的數據都消費成功了。
- Current Position:consumer group 當前消費數據的 offset,也就是說,Last Committed Offset 到 Current Position 之間的數據已經拉取成功,可能正在處理,但是還未 commit。
- Log End Offset(LEO):記錄底層日志 (log) 中的下一條消息的 offset。, 對 producer 來說,就是即將插入下一條消息的 offset。
- High Watermark(HW):已經成功備份到其他 replicas 中的最新一條數據的 offset,也就是說 Log End Offset 與 High Watermark 之間的數據已經寫入到該 partition 的 leader 中,但是還未完全備份到其他的 replicas 中,consumer 是無法消費這部分消息 (未提交消息)。
每個 Kafka 副本對象都有兩個重要的屬性:LEO 和 HW。注意是所有的副本,而不只是 leader 副本。關於這兩者更詳細解釋,建議參考這篇文章。
對於消費者而言,異步模式下 committed offset 是落后於 current position 的。如果 consumer 掛掉了, 那么下一次消費數據又只會從 committed offset 的位置拉取數據,就會導致數據被重復消費。