昨天在寫一個java消費kafka資料的執行個體,明明設定auto.offset.reset為earliest,但還是不從頭開始消費,官網給出的含義太抽象了。
earliest: automatically reset the offset to the earliest offset,自動将偏移量置為最早的。難道不是topic中各分區的開始?結果還真不是,具體含義如下:
auto.offset.reset值含義解釋
earliest
當各分區下有已送出的offset時,從送出的offset開始消費;無送出的offset時,從頭開始消費
latest
當各分區下有已送出的offset時,從送出的offset開始消費;無送出的offset時,消費新産生的該分區下的資料
none
topic各分區都存在已送出的offset時,從offset後開始消費;隻要有一個分區不存在已送出的offset,則抛出異常
以下為測試詳細:
1.同分組下測試
1.1測試一
1.1.1測試環境
Topic為lsztopic7,并生産30條資訊。lsztopic7詳情:
建立組為“testtopi7”的consumer,将enable.auto.commit設定為false,不送出offset。依次更改auto.offset.reset的值。此時檢視offset情況為:
1.1.2測試結果
用戶端讀取30條資訊,且各分區的offset從0開始消費。
用戶端讀取0條資訊。
抛出NoOffsetForPartitionException異常。
1.1.3測試結論
建立一個同組名的消費者時,auto.offset.reset值含義:
earliest 每個分區是從頭開始消費的。
none 沒有為消費者組找到先前的offset值時,抛出異常
1.2測試二
1.2.1測試環境
測試場景一下latest時未接受到資料,保證該消費者在啟動狀态,使用生産者繼續生産10條資料,總資料為40條。
1.2.2測試結果
用戶端取到了後生産的10條資料
1.2.3測試結論
當建立一個新分組的消費者時,auto.offset.reset值為latest時,表示消費新的資料(從consumer建立開始,後生産的資料),之前産生的資料不消費。
1.3測試三
1.3.1測試環境
在測試環境二,總數為40條,無消費情況下,消費一批資料。運作消費者消費程式後,取到5條資料。
即,總數為40條,已消費5條,剩餘35條。
1.3.2測試結果
消費35條資料,即将剩餘的全部資料消費完。
消費9條資料,都是分區3的值。
offset:0 partition:3
offset:1 partition:3
offset:2 partition:3
offset:3 partition:3
offset:4 partition:3
offset:5 partition:3
offset:6 partition:3
offset:7 partition:3
offset:8 partition:3
1.3.3測試結論
earliest 當分區下有已送出的offset時,從送出的offset開始消費;無送出的offset時,從頭開始消費。
latest 當分區下有已送出的offset時,從送出的offset開始消費;無送出的offset時,消費新産生的該分區下的資料。
none 當該topic下所有分區中存在未送出的offset時,抛出異常。
1.4測試四
1.4.1測試環境
再測試三的基礎上,将資料消費完,再生産10條資料,確定每個分區上都有已送出的offset。
此時,總數為50,已消費40,剩餘10條
1.4.2測試結果
消費10條資訊,且各分區都是從offset開始消費
offset:9 partition:3
offset:10 partition:3
offset:11 partition:3
offset:15 partition:0
offset:16 partition:0
offset:17 partition:0
offset:18 partition:0
offset:19 partition:0
offset:20 partition:0
offset:5 partition:2
1.4.3測試結論
值為none時,topic各分區都存在已送出的offset時,從offset後開始消費;隻要有一個分區不存在已送出的offset,則抛出異常。
2.不同分組下測試
2.1測試五
2.1.1測試環境
在測試四環境的基礎上:總數為50,已消費40,剩餘10條,建立不同組的消費者,組名為testother7
2.1.2 測試結果
消費50條資料,即将全部資料消費完。
消費0條資料。
抛出異常
2.1.3測試結論