kafka消費延遲或者重復(fù)消費原因

簡介

由于項目中需要使用kafka作為消息隊列愉择,并且項目是基于spring-boot來進(jìn)行構(gòu)建的,所以項目采用了spring-kafka作為原生kafka的一個擴展庫進(jìn)行使用壳鹤。先說明一下版本:

  • spring-boot 的版本是1.4.0.RELEASE
  • kafka 的版本是0.9.0.x 版本
  • spring-kafka 的版本是1.0.3.RELEASE

用過kafka的人都知道,對于使用kafka來說,producer的使用相對簡單一些,只需要把數(shù)據(jù)按照指定的格式發(fā)送給kafka中某一個topic就可以了砖茸。本文主要是針對spring-kafka的consumer端上的使用進(jìn)行簡單一些分析和總結(jié)。

kafka的速度是很快脯倚,所以一般來說producer的生產(chǎn)消息的邏輯速度都會比consumer的消費消息的邏輯速度快。

具體案例

之前在項目中遇到了一個案例是嵌屎,consumer消費一條數(shù)據(jù)平均需要200ms的時間推正,并且在某個時刻,producer會在短時間內(nèi)產(chǎn)生大量的數(shù)據(jù)丟進(jìn)kafka的broker里面(假設(shè)平均1s中內(nèi)丟入了5w條需要消費的消息宝惰,這個情況會持續(xù)幾分鐘)植榕。

對于這種情況,kafka的consumer的行為會是:

  • kafka的consumer會從broker里面取出一批數(shù)據(jù)尼夺,?給消費線程進(jìn)行消費尊残。
  • 由于取出的一批消息數(shù)量太大炒瘸,consumer在session.timeout.ms時間之內(nèi)沒有消費完成
  • consumer coordinator 會由于沒有接受到心跳而掛掉,并且出現(xiàn)一些日志
    日志的意思大概是coordinator掛掉了寝衫,然后自動提交offset失敗顷扩,然后重新分配partition給客戶端
  • 由于自動提交offset失敗,導(dǎo)致重新分配了partition的客戶端又重新消費之前的一批數(shù)據(jù)
  • 接著consumer重新消費慰毅,又出現(xiàn)了消費超時隘截,無限循環(huán)下去。

解決方案

遇到了這個問題之后汹胃, 我們做了一些步驟:

  • 提高了partition的數(shù)量婶芭,從而提高了consumer的并行能力,從而提高數(shù)據(jù)的消費能力
  • 對于單partition的消費線程着饥,增加了一個固定長度的阻塞隊列和工作線程池進(jìn)一步提高并行消費的能力
  • 由于使用了spring-kafka犀农,則把kafka-client的enable.auto.commit設(shè)置成了false,表示禁止kafka-client自動提交offset宰掉,因為就是之前的自動提交失敗呵哨,導(dǎo)致offset永遠(yuǎn)沒更新,從而轉(zhuǎn)向使用spring-kafka的offset提交機制贵扰。并且spring-kafka提供了多種提交策略:
    這些策略保證了在一批消息沒有完成消費的情況下仇穗,也能提交offset,從而避免了完全提交不上而導(dǎo)致永遠(yuǎn)重復(fù)消費的問題戚绕。

分析

那么問題來了纹坐,為什么spring-kafka的提交offset的策略能夠解決spring-kafka的auto-commit的帶來的重復(fù)消費的問題呢?下面通過分析spring-kafka的關(guān)鍵源碼來解析這個問題舞丛。

首先來看看spring-kafka的消費線程邏輯

if (isRunning() && this.definedPartitions != null) { 
      initPartitionsIfNeeded();      
 // we start the invoker here as there will be no rebalance calls to       
// trigger it, but only if the container is not set to autocommit       
// otherwise we will process records on a separate thread      
     if (!this.autoCommit) {        
            startInvoker();     
     }
 }
  • 上面可以看到耘子,如果auto.commit關(guān)掉的話,spring-kafka會啟動一個invoker球切,這個invoker的目的就是啟動一個線程去消費數(shù)據(jù)谷誓,他消費的數(shù)據(jù)不是直接從kafka里面直接取的,那么他消費的數(shù)據(jù)從哪里來呢吨凑?他是從一個spring-kafka自己創(chuàng)建的阻塞隊列里面取的捍歪。

  • 然后會進(jìn)入一個循環(huán),從源代碼中可以看到如果auto.commit被關(guān)掉的話鸵钝, 他會先把之前處理過的數(shù)據(jù)先進(jìn)行提交offset糙臼,然后再去從kafka里面取數(shù)據(jù)。

  • 然后把取到的數(shù)據(jù)丟給上面提到的阻塞列隊恩商,由上面創(chuàng)建的線程去消費变逃,并且如果阻塞隊列滿了導(dǎo)致取到的數(shù)據(jù)塞不進(jìn)去的話,spring-kafka會調(diào)用kafka的pause方法怠堪,則consumer會停止從kafka里面繼續(xù)再拿數(shù)據(jù)揽乱。

  • 接著spring-kafka還會處理一些異常的情況名眉,比如失敗之后是不是需要commit offset這樣的邏輯。

方法二

  • 可以根據(jù)消費者的消費速度對session.timeout.ms的時間進(jìn)行設(shè)置凰棉,適當(dāng)延長
  • 或者減少每次從partition里面撈取的數(shù)據(jù)分片的大小损拢,提高消費者的消費速度。

參考鏈接:http://www.reibang.com/p/4e00dff97f39

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末渊啰,一起剝皮案震驚了整個濱河市探橱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌绘证,老刑警劉巖隧膏,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異嚷那,居然都是意外死亡胞枕,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門魏宽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來腐泻,“玉大人,你說我怎么就攤上這事队询∨勺” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵蚌斩,是天一觀的道長铆惑。 經(jīng)常有香客問我,道長送膳,這世上最難降的妖魔是什么员魏? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮叠聋,結(jié)果婚禮上撕阎,老公的妹妹穿的比我還像新娘。我一直安慰自己碌补,他們只是感情好虏束,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著厦章,像睡著了一般镇匀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上闷袒,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天坑律,我揣著相機與錄音岩梳,去河邊找鬼囊骤。 笑死晃择,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的也物。 我是一名探鬼主播宫屠,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼滑蚯!你這毒婦竟也來了浪蹂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤告材,失蹤者是張志新(化名)和其女友劉穎坤次,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斥赋,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡缰猴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了疤剑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片滑绒。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖隘膘,靈堂內(nèi)的尸體忽然破棺而出疑故,到底是詐尸還是另有隱情,我是刑警寧澤弯菊,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布纵势,位于F島的核電站,受9級特大地震影響误续,放射性物質(zhì)發(fā)生泄漏吨悍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一蹋嵌、第九天 我趴在偏房一處隱蔽的房頂上張望育瓜。 院中可真熱鬧,春花似錦栽烂、人聲如沸躏仇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽焰手。三九已至,卻和暖如春怀喉,著一層夾襖步出監(jiān)牢的瞬間书妻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工躬拢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留躲履,地道東北人见间。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像工猜,于是被迫代替她去往敵國和親米诉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理篷帅,服務(wù)發(fā)現(xiàn)史侣,斷路器,智...
    卡卡羅2017閱讀 134,661評論 18 139
  • 姓名:周小蓬 16019110037 轉(zhuǎn)載自:http://blog.csdn.net/YChenFeng/art...
    aeytifiw閱讀 34,722評論 13 425
  • Kafka簡介 Kafka是一種分布式的魏身,基于發(fā)布/訂閱的消息系統(tǒng)惊橱。主要設(shè)計目標(biāo)如下: 以時間復(fù)雜度為O(1)的方...
    Alukar閱讀 3,083評論 0 43
  • 本文轉(zhuǎn)載自http://dataunion.org/?p=9307 背景介紹Kafka簡介Kafka是一種分布式的...
    Bottle丶Fish閱讀 5,469評論 0 34
  • 對于對面樓上那位領(lǐng)導(dǎo)長期把狗放在樓下公共區(qū)域、狗叫吵人的事箭昵,葉子經(jīng)過了長期的憤怒之后李皇,終于有了一點轉(zhuǎn)折性的進(jìn)步。 ...
    自由心空閱讀 279評論 0 2