一噪服、技術(shù)說(shuō)明
springboot2.0
kafka1.0.2
spring-kafka
采用配置文件的方式配置kafka毡泻,因?yàn)閟pringboo配置文件配置并不全
二、場(chǎng)景說(shuō)明
客戶服務(wù)器部署kafka集群粘优,目前是3臺(tái)仇味,每天的數(shù)據(jù)量大約是100萬(wàn)條呻顽,存入kafka中,我們這邊需要消費(fèi)kafka中數(shù)據(jù)丹墨,取出kafka中數(shù)據(jù)入庫(kù)并發(fā)送到大屏頁(yè)面
三廊遍、代碼截圖
1、配置文件
2贩挣、配置類
3喉前、代碼
四、遇到的問(wèn)題
1王财、目前的代碼是一條條獲取數(shù)據(jù)卵迂,本來(lái)想做成批量處理,每次發(fā)送過(guò)來(lái)1000條數(shù)據(jù)绒净,然后再進(jìn)行處理见咒,但發(fā)現(xiàn)每次關(guān)掉服務(wù),再重新啟動(dòng)挂疆,數(shù)據(jù)的偏移量很大改览,也就是數(shù)據(jù)丟失很多,所以目前是采用一條條獲取數(shù)據(jù)缤言,這樣能保證數(shù)據(jù)沒(méi)有偏移宝当。而且如果處理過(guò)程簡(jiǎn)單,一條條這樣處理也很快胆萧,一秒能幾萬(wàn)條今妄。
2、消費(fèi)者有兩種提交策略鸳碧,自動(dòng)提交和手動(dòng)提交。如果消費(fèi)者處理數(shù)據(jù)過(guò)程簡(jiǎn)單犬性,耗時(shí)較小瞻离,那么這兩種策略都沒(méi)問(wèn)題,都能進(jìn)行提交乒裆。但消費(fèi)者處理數(shù)據(jù)過(guò)程復(fù)雜套利,耗時(shí)較大,使用自動(dòng)提交時(shí)鹤耍,取出的數(shù)據(jù)在session.timeout.ms時(shí)間內(nèi)沒(méi)有處理完成肉迫,自動(dòng)提交offset失敗,然后kafka會(huì)重新分配partition給消費(fèi)者稿黄,消費(fèi)者又重新消費(fèi)之前的一批數(shù)據(jù)喊衫,又出現(xiàn)了消費(fèi)超時(shí),所以會(huì)造成死循環(huán)杆怕,一直消費(fèi)相同的數(shù)據(jù)族购。
3壳贪、代碼中使用Acknowledgment進(jìn)行消息提交,很多文章中都說(shuō)使用KafkaConsumer寝杖,同步提交违施,但我測(cè)試了一上午,數(shù)據(jù)不會(huì)重復(fù)瑟幕,但是每次關(guān)閉重啟偏移量都是500磕蒲,不知道因?yàn)槭裁磫?wèn)題。
4只盹、配置文件中能配置消費(fèi)線程數(shù)辣往,由于topic分區(qū)數(shù)是3個(gè),所以這里設(shè)置線程數(shù)為3鹿霸,但感覺(jué)速度也不快排吴。
五、目前存在的問(wèn)題
1懦鼠、由于消費(fèi)者處理速度低钻哩,導(dǎo)致獲取數(shù)據(jù)一直延時(shí),跑兩天數(shù)據(jù)肛冶,延時(shí)大約4小時(shí)街氢。無(wú)法滿足實(shí)時(shí)獲取數(shù)據(jù)的要求。
2睦袖、目前想到的方法是增加分區(qū)數(shù)珊肃、增加消費(fèi)者線程、異步入庫(kù)(但不滿足項(xiàng)目需求)
六馅笙、知識(shí)點(diǎn)
1伦乔、一個(gè)topic中可以有多個(gè)分區(qū),每個(gè)分區(qū)都存著數(shù)據(jù)董习,負(fù)載均衡由kafka內(nèi)部機(jī)制控制烈和,一個(gè)分區(qū)中數(shù)據(jù)只能被一個(gè)消費(fèi)組中一個(gè)消費(fèi)者消費(fèi)。
2皿淋、一個(gè)消費(fèi)者能消費(fèi)多個(gè)分區(qū)中數(shù)據(jù)招刹,網(wǎng)上說(shuō)最好一個(gè)分區(qū)由一個(gè)消費(fèi)者消費(fèi),或者設(shè)置線程數(shù)等于分區(qū)數(shù)
3窝趣、auto.offset.reset這個(gè)參數(shù)的說(shuō)明
消費(fèi)組中如果存在已經(jīng)提交的offest時(shí),不管設(shè)置為earliest 或者latest 都會(huì)從已經(jīng)提交的offest處開(kāi)始消費(fèi)
消費(fèi)組中如果不存在已經(jīng)提交的offest時(shí),earliest 表示從頭開(kāi)始消費(fèi),latest 表示從最新的數(shù)據(jù)消費(fèi),也就是新產(chǎn)生的數(shù)據(jù).
none topic各分區(qū)都存在已提交的offset時(shí)疯暑,從提交的offest處開(kāi)始消費(fèi);只要有一個(gè)分區(qū)不存在已提交的offset哑舒,則拋出異常
如果想讓auto.offset.reset生效妇拯,那么最好的辦法是重新設(shè)置一個(gè)groupid
4、分區(qū)中數(shù)據(jù)是有序的洗鸵,一條數(shù)據(jù)對(duì)應(yīng)一個(gè)分區(qū)中一個(gè)偏移量乖阵,各個(gè)分區(qū)中偏移量可以相同宣赔,這個(gè)要注意。