Kafka auto.offset.reset值詳解


來源於 https://my.oschina.net/u/3346994/blog/1859039/

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

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

1.1.3測試結論

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

1.2測試二

1.2.1測試環境

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

1.2.2測試結果

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

1.2.3測試結論

當創建一個新分組的消費者時,auto.offset.reset值為latest時,表示消費新的數據(從consumer創建開始,后生產的數據),之前產生的數據不消費。

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對新建的分組消費不起作用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM