Kafka auto.offset.reset值詳解

昨天在寫一個java消費kafka數據的實例,明明設置auto.offset.reset爲earliest,但仍是不從頭開始消費,官網給出的含義太抽象了。 
earliest: automatically reset the offset to the earliest offset,自動將偏移量置爲最先的。難道不是topic中各分區的開始?結果還真不是,具體含義以下:java

auto.offset.reset值含義解釋

earliest 
當各分區下有已提交的offset時,從提交的offset開始消費;無提交的offset時,從頭開始消費 
latest 
當各分區下有已提交的offset時,從提交的offset開始消費;無提交的offset時,消費新產生的該分區下的數據 
none 
topic各分區都存在已提交的offset時,從offset後開始消費;只要有一個分區不存在已提交的offset,則拋出異常測試

如下爲測試詳細:spa

1.同分組下測試

1.1測試一

1.1.1測試環境

Topic爲lsztopic7,並生產30條信息。lsztopic7詳情: 
這裏寫圖片描述
建立組爲「testtopi7」的consumer,將enable.auto.commit設置爲false,不提交offset。依次更改auto.offset.reset的值。此時查看offset狀況爲: 
這裏寫圖片描述blog

1.1.2測試結果

earliest 
客戶端讀取30條信息,且各分區的offset從0開始消費。 
latest 
客戶端讀取0條信息。 
none 
拋出NoOffsetForPartitionException異常。 
這裏寫圖片描述圖片

1.1.3測試結論

新建一個同組名的消費者時,auto.offset.reset值含義: 
earliest 每一個分區是從頭開始消費的。 
none 沒有爲消費者組找到先前的offset值時,拋出異常kafka

1.2測試二

1.2.1測試環境

測試場景一下latest時未接受到數據,保證該消費者在啓動狀態,使用生產者繼續生產10條數據,總數據爲40條。 
這裏寫圖片描述it

1.2.2測試結果

latest 
客戶端取到了後生產的10條數據io

1.2.3測試結論

當建立一個新分組的消費者時,auto.offset.reset值爲latest時,表示消費新的數據(從consumer建立開始,後生產的數據),以前產生的數據不消費。test

1.3測試三

1.3.1測試環境

在測試環境二,總數爲40條,無消費狀況下,消費一批數據。運行消費者消費程序後,取到5條數據。 
即,總數爲40條,已消費5條,剩餘35條。 
這裏寫圖片描述基礎

1.3.2測試結果

earliest 
消費35條數據,即將剩餘的所有數據消費完。

latest 
消費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

none 
拋出NoOffsetForPartitionException異常。 
這裏寫圖片描述

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測試結果

none 
消費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 測試結果

earliest 
消費50條數據,即將所有數據消費完。

latest 
消費0條數據。

none 
拋出異常 
這裏寫圖片描述

2.1.3測試結論

組與組間的消費者是沒有關係的。  topic中已有分組消費數據,新建其餘分組ID的消費者時,以前分組提交的offset對新建的分組消費不起做用。

相關文章
相關標籤/搜索