先來一下 kafka 官網(wǎng)對于 auto.offset.reset 的解釋:
上面的描述挺準(zhǔn)確的,但如果沒有相關(guān)背景會感覺很懵逼。網(wǎng)上也有很多文章講這個東西并給了很多例子,看了之后總感覺沒有理解清楚。
先來看一下怎么查看消費者 group 的 offset 情況:
每個 consumer group 會為每個消費的 partition 保存 offsets,這些 offsets 被保存在 kafka 的內(nèi)部 topic:__consumer_offsets。
假設(shè)有一個 group:demo-consumer-group 和一個 topic:demo-topic,并且只有一個分區(qū),先向其中發(fā)送兩條消息。
運行 kafka 的管理腳本:
bin/kafka-consumer-groups.sh --describe --bootstrap-server 127.0.0.1:9092 --group demo-consumer-group
重點:下面的描述都是針對一個消費者 group 的,不同消費者 group 的 CURRENT-OFFSET、LOG-END-OFFSET、LAG 將會重新計算。
這個 partition 有兩條消息,所以 LOG-END-OFFSET 是 2。
當(dāng)有消費者 A 來消費這個分區(qū)的時候,auto.offset.reset 被設(shè)置成 latest,因為還沒有正確設(shè)置 offset,這個消費者不會消費之前的消息,從 CURRENT-OFFSET 可以看出來。LAG 表示當(dāng)前消費者還剩多少消息沒有消費。
這里有個數(shù)據(jù)丟失的場景, 當(dāng)這個消費者 A 收到第三條消息的時候,如果處理失敗沒有提交 offset,LOG-END-OFFSET 變成了 3,但是 CURRENT-OFFSET 還是未設(shè)置。這個時候發(fā)生重平衡,消費者 B 被分配到來消費這個分區(qū)的消息,消費者 B 也是消費不到第三個消息的。
當(dāng)消費者正常消費消息后,CURRENT-OFFSET 將會被設(shè)置,即使消費者停了也是有這個記錄的。當(dāng)有新的消費者重新啟動開始消費的時候,如果 CURRENT-OFFSET 有值,auto.offset.reset 設(shè)置成什么已經(jīng)不重要了,都將會從 CURRENT-OFFSET 的下一個 offset 進(jìn)行消費。
所以 auto.offset.reset 這個配置的設(shè)置是跟 CURRENT-OFFSET 是有關(guān)系的,如果 CURRENT-OFFSET 沒有設(shè)置值,那 earliest 就從這個 partition 從頭到尾開始消費,latest 不會消費消息,如果 CURRENT-OFFSET 有值,就是 CURRENT-OFFSET 指向的下一個 offset 開始消費。
有了這個知識點,應(yīng)該可以看懂這篇博客了:
Kafka auto.offset.reset值詳解
所以當(dāng)新開一個 消費者組的時候如果使用了 earliest 的話,會消費那個 partition 之前的所有消息,那就需要考慮數(shù)據(jù)的容量和消費資源是否足夠的影響了。
參考:
Kafka Consumer Auto Offset Reset
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧