官方文檔解釋
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.
官方文檔說得很清楚了:kafka中沒有offset時伙窃,不論是什么原因,offset沒了样漆,這是auto.offset.reset配置就會起作用为障,
- earliest:從最早的offset開始消費,就是partition的起始位置開始消費
- latest:從最近的offset開始消費放祟,就是新加入partition的消息才會被消費
- none:報錯
測試
最容易測試的方式就是在partition中預存放一些消息鳍怨,然后新建一個consum group來消費這個partition。
測試步驟:創(chuàng)建兩個不同組的消費者跪妥,分別設置為earliest和latest
預先生產10條消息
啟動兩個消費者鞋喇,觀察消息獲取
在不關閉消費者的情況下,繼續(xù)生產10條消息
觀察消息獲取
第一步寫入消息
@Autowired
private KafkaTemplate kafkaTemplate;
@Test
void sendMsg() {
for (int i = 0; i < 10; i++) {
kafkaTemplate.send("test", "message" + i);
}
}
第二步創(chuàng)建骗奖、啟動消費者
創(chuàng)建兩個消費者consumer1(earliest)确徙、consumer2(lastest)醒串,分別啟動后觀察到consumer1消費到10條消息,consumer2消費到0條消息
consumer1: partitions assigned: [test-0]
message0
message1
message2
message3
message4
message5
message6
message7
message8
message9
consumer2: partitions assigned: [test-0]
第三步繼續(xù)生產消息
可以觀察到兩個消費者都消費了新的10條消息
message10
message11
message12
message13
message14
message15
message16
message17
message18
message19
第四步消費者關閉鄙皇,再生產10條消息芜赌,啟動消費者
此時在kafka服務器已經記錄了消費者的offset,重啟后兩個消費者都從記錄中的offset開始消費
message20
message21
message22
message23
message24
message25
message26
message27
message28
message29
總結
如果kafka服務器記錄有消費者消費到的offset伴逸,那么消費者會從該offset開始消費
如果由于某些offset記錄丟失了缠沈,此時auto-offset-reset就起了作用,earlist從頭開始消費错蝴,latest從最新生產的消息開始消費
作者:陸陽226
鏈接:http://www.reibang.com/p/2e0e682f77dd