kafka自动提交offset失败:Auto offset commit failed
今天在服務(wù)日志中觀察數(shù)據(jù)的消費(fèi)情況時(shí),發(fā)現(xiàn)了一個(gè)如下的警告,而且每隔幾秒就會(huì)出現(xiàn)一次,雖然只是個(gè)警告,
?
Auto offset commit failed for group order_group:Commit cannot be completed since the group has already rebalanced and assigned the partitions to another member.This means that the time between subsequent calls to poll() was longer than the configured max.poll.interval.ms,which typically implies that the poll loop is spending too much time message processing.You can address this either by increasing the session timeout or by reducing the maximum size of batches returned in poll() with max.poll.records.但是看到auto offset commit failed時(shí)我就不淡定了,不難看出是自動(dòng)提交offset失敗了,我們都知道,kafka的數(shù)據(jù)更新消費(fèi)都是通過(guò)在zookeeper中標(biāo)記一個(gè)偏移量(offset)來(lái)記錄每個(gè)分區(qū)的消費(fèi)位置,所以一旦offset更新失敗,不難想象肯定會(huì)出現(xiàn)重復(fù)消費(fèi)數(shù)據(jù)的問(wèn)題!
通過(guò)以上信息分析大概意思是:kafka消費(fèi)者在處理消息時(shí),在指定時(shí)間內(nèi)(session.time.out)沒(méi)有處理完,consumer coordinator會(huì)由于沒(méi)有接受到心跳而掛掉,導(dǎo)致自動(dòng)提交offset失敗,因此就會(huì)像日志中所說(shuō)的發(fā)生rebalanced(重平衡即重新分配partition給客戶端),而之前提交的offset已經(jīng)失敗了,所以重新分配的客戶端又會(huì)消費(fèi)之前的數(shù)據(jù),接著consumer重新消費(fèi),又出現(xiàn)了消費(fèi)超時(shí),無(wú)限循環(huán)下去。
解決方法:
將enable.auto.commit設(shè)置成false,即不采用自動(dòng)提交方式;
?
由于使用了spring-kafka,禁止kafka-client自動(dòng)提交offset,因?yàn)榫褪侵暗淖詣?dòng)提交失敗,導(dǎo)致offset永遠(yuǎn)沒(méi)更新,從而轉(zhuǎn)向使用spring-kafka的offset提交機(jī)制。
1)如果auto.commit關(guān)掉的話,spring-kafka會(huì)啟動(dòng)一個(gè)invoker,這個(gè)invoker的目的就是啟動(dòng)一個(gè)線程去消費(fèi)數(shù)據(jù),他消費(fèi)的數(shù)據(jù)不是直接從kafka里面直接取的,那么他消費(fèi)的數(shù)據(jù)從哪里來(lái)呢?他是從一個(gè)spring-kafka自己創(chuàng)建的阻塞隊(duì)列里面取的。
2)然后會(huì)進(jìn)入一個(gè)循環(huán),從源代碼中可以看到如果auto.commit被關(guān)掉的話, 他會(huì)先把之前處理過(guò)的數(shù)據(jù)先進(jìn)行提交offset,然后再去從kafka里面取數(shù)據(jù)。
3)然后把取到的數(shù)據(jù)丟給上面提到的阻塞列隊(duì),由上面創(chuàng)建的線程去消費(fèi),并且如果阻塞隊(duì)列滿了導(dǎo)致取到的數(shù)據(jù)塞不進(jìn)去的話,spring-kafka會(huì)調(diào)用kafka的pause方法,則consumer會(huì)停止從kafka里面繼續(xù)再拿數(shù)據(jù)。
4)接著spring-kafka還會(huì)處理一些異常的情況,比如失敗之后是不是需要commit offset這樣的邏輯
?
參考:https://www.jianshu.com/p/9b444d4b32c0
總結(jié)
以上是生活随笔為你收集整理的kafka自动提交offset失败:Auto offset commit failed的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: kafka重复消费问题
- 下一篇: 24位rgb真彩色到底是什么