天天看點

Kafka auto.offset.reset值詳解

昨天在寫一個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測試結論

繼續閱讀