官方文檔解釋
auto.offset.reset: What to do when there is no initial offset in Kafka or if the current offset does not exist any more on the server (e.g. because that data has been deleted):
earliest: automatically reset the offset to the earliest offset
latest: automatically reset the offset to the latest offset
none: throw exception to the consumer if no previous offset is found for the consumer's group
anything else: throw exception to the consumer.
官方文檔說(shuō)得很清楚了:kafka中沒(méi)有offset時(shí)悍赢,不論是什么原因,offset沒(méi)了超燃,這是auto.offset.reset配置就會(huì)起作用,
- earliest:從最早的offset開(kāi)始消費(fèi)拘领,就是partition的起始位置開(kāi)始消費(fèi)
- latest:從最近的offset開(kāi)始消費(fèi)意乓,就是新加入partition的消息才會(huì)被消費(fèi)
- none:報(bào)錯(cuò)
測(cè)試
最容易測(cè)試的方式就是在partition中預(yù)存放一些消息,然后新建一個(gè)consum group來(lái)消費(fèi)這個(gè)partition约素。
測(cè)試步驟:創(chuàng)建兩個(gè)不同組的消費(fèi)者洽瞬,分別設(shè)置為earliest和latest
- 預(yù)先生產(chǎn)10條消息
- 啟動(dòng)兩個(gè)消費(fèi)者,觀察消息獲取
- 在不關(guān)閉消費(fèi)者的情況下业汰,繼續(xù)生產(chǎn)10條消息
- 觀察消息獲取
第一步寫(xiě)入消息
@Autowired
private KafkaTemplate kafkaTemplate;
@Test
void sendMsg() {
for (int i = 0; i < 10; i++) {
kafkaTemplate.send("test", "message" + i);
}
}
第二步創(chuàng)建伙窃、啟動(dòng)消費(fèi)者
創(chuàng)建兩個(gè)消費(fèi)者consumer1(earliest)、consumer2(lastest)样漆,分別啟動(dòng)后觀察到consumer1消費(fèi)到10條消息为障,consumer2消費(fèi)到0條消息
consumer1: partitions assigned: [test-0]
message0
message1
message2
message3
message4
message5
message6
message7
message8
message9
consumer2: partitions assigned: [test-0]
第三步繼續(xù)生產(chǎn)消息
可以觀察到兩個(gè)消費(fèi)者都消費(fèi)了新的10條消息
message10
message11
message12
message13
message14
message15
message16
message17
message18
message19
第四步消費(fèi)者關(guān)閉,再生產(chǎn)10條消息,啟動(dòng)消費(fèi)者
此時(shí)在kafka服務(wù)器已經(jīng)記錄了消費(fèi)者的offset鳍怨,重啟后兩個(gè)消費(fèi)者都從記錄中的offset開(kāi)始消費(fèi)
message20
message21
message22
message23
message24
message25
message26
message27
message28
message29
總結(jié)
- 如果kafka服務(wù)器記錄有消費(fèi)者消費(fèi)到的offset呻右,那么消費(fèi)者會(huì)從該offset開(kāi)始消費(fèi)
- 如果由于某些offset記錄丟失了,此時(shí)auto-offset-reset就起了作用鞋喇,earlist從頭開(kāi)始消費(fèi)声滥,latest從最新生產(chǎn)的消息開(kāi)始消費(fèi)