昨天在寫一個java消費kafka數據的實例,明明設置auto.offset.reset爲earliest,但仍是不從頭開始消費,官網給出的含義太抽象了。
earliest: automatically reset the offset to the earliest offset,自動將偏移量置爲最先的。難道不是topic中各分區的開始?結果還真不是,具體含義以下:java
earliest
當各分區下有已提交的offset時,從提交的offset開始消費;無提交的offset時,從頭開始消費
latest
當各分區下有已提交的offset時,從提交的offset開始消費;無提交的offset時,消費新產生的該分區下的數據
none
topic各分區都存在已提交的offset時,從offset後開始消費;只要有一個分區不存在已提交的offset,則拋出異常測試
如下爲測試詳細:spa
Topic爲lsztopic7,並生產30條信息。lsztopic7詳情:
建立組爲「testtopi7」的consumer,將enable.auto.commit設置爲false,不提交offset。依次更改auto.offset.reset的值。此時查看offset狀況爲:
blog
earliest
客戶端讀取30條信息,且各分區的offset從0開始消費。
latest
客戶端讀取0條信息。
none
拋出NoOffsetForPartitionException異常。
圖片
新建一個同組名的消費者時,auto.offset.reset值含義:
earliest 每一個分區是從頭開始消費的。
none 沒有爲消費者組找到先前的offset值時,拋出異常kafka
測試場景一下latest時未接受到數據,保證該消費者在啓動狀態,使用生產者繼續生產10條數據,總數據爲40條。
it
latest
客戶端取到了後生產的10條數據io
當建立一個新分組的消費者時,auto.offset.reset值爲latest時,表示消費新的數據(從consumer建立開始,後生產的數據),以前產生的數據不消費。test
在測試環境二,總數爲40條,無消費狀況下,消費一批數據。運行消費者消費程序後,取到5條數據。
即,總數爲40條,已消費5條,剩餘35條。
基礎
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異常。
earliest 當分區下有已提交的offset時,從提交的offset開始消費;無提交的offset時,從頭開始消費。
latest 當分區下有已提交的offset時,從提交的offset開始消費;無提交的offset時,消費新產生的該分區下的數據。
none 當該topic下全部分區中存在未提交的offset時,拋出異常。
再測試三的基礎上,將數據消費完,再生產10條數據,確保每一個分區上都有已提交的offset。
此時,總數爲50,已消費40,剩餘10條
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
值爲none時,topic各分區都存在已提交的offset時,從offset後開始消費;只要有一個分區不存在已提交的offset,則拋出異常。
在測試四環境的基礎上:總數爲50,已消費40,剩餘10條,建立不一樣組的消費者,組名爲testother7
earliest
消費50條數據,即將所有數據消費完。
latest
消費0條數據。
none
拋出異常
組與組間的消費者是沒有關係的。 topic中已有分組消費數據,新建其餘分組ID的消費者時,以前分組提交的offset對新建的分組消費不起做用。