裴宏祥 于曉虹
摘要: kafka是一個(gè)高吞吐量、高性能的分布式消息系統(tǒng),高吞吐量能夠支撐海量數(shù)據(jù)處理需求,高性能能夠高效實(shí)時(shí)的傳播數(shù)據(jù)。本文淺析kafka的特征和應(yīng)用,并提出了基于此的軟件系統(tǒng)設(shè)計(jì)應(yīng)用,希望可以為相關(guān)研究提供參考。
【關(guān)鍵詞】kafka 消息隊(duì)列 開發(fā) 應(yīng)用
為迎合應(yīng)用系統(tǒng)的高吞吐量、高實(shí)時(shí)性的要求,筆者所在項(xiàng)目,采用kafka作為消息平臺(tái),完成海量話單數(shù)據(jù)的傳輸和并發(fā)實(shí)時(shí)處理。1Kafka的特點(diǎn)
(1)處理速度快,高吞吐量,呈分布式,多分區(qū)。
(2)不需要停機(jī),就可以實(shí)現(xiàn)主機(jī)的擴(kuò)展。
(3)能夠把數(shù)據(jù)長(zhǎng)久的放到硬盤和replication中,防止丟失數(shù)據(jù)。
(4)可以支持多消費(fèi)者(重要特點(diǎn))。
(5)支持online(實(shí)時(shí)消費(fèi))和offline(離線消費(fèi),比如按天消費(fèi))的等消費(fèi)模式。
(6) Kafka的消費(fèi)都是利用pull的方式,就是依靠客戶端comsumer主動(dòng)拉取數(shù)據(jù),在客戶端維護(hù)offset偏移量。客戶端實(shí)現(xiàn)了消費(fèi)的隨意性,更加靈活,并且對(duì)服務(wù)端的壓力小。
和以前的消息中間件比起來,Kafka的創(chuàng)新之處最為主要的就是其代理服務(wù)器呈現(xiàn)無狀態(tài)性,對(duì)于消息(Message),代理不會(huì)記錄是不是為用戶所讀取,更不會(huì)清除消息。而且,在Kafka中,數(shù)據(jù)壓縮的形式大大節(jié)約了空問,提高了運(yùn)作的效率。
2 基于kafka消息平臺(tái)的系統(tǒng)設(shè)計(jì)研究
基于kafka進(jìn)行系統(tǒng)設(shè)計(jì)開發(fā)時(shí),要充分結(jié)合系統(tǒng)目標(biāo)及kafka的特點(diǎn)。本文主要針對(duì)筆者所在項(xiàng)目的設(shè)計(jì)過程中,遇到的關(guān)鍵點(diǎn)進(jìn)行簡(jiǎn)要分析,涉及消息準(zhǔn)確性保證、消息可追溯性、消息批量處理等。
2.1 合適的偏移量管理模式設(shè)計(jì)
根據(jù)軟件系統(tǒng)不同業(yè)務(wù)對(duì)數(shù)據(jù)處理的要求,選擇合適的偏移量管理模式,是應(yīng)用自己管理offset,還是使用kafka提供的機(jī)制。對(duì)消息處理可以重復(fù)或遺漏時(shí),可以使用kafka提供的High-level接口集,來維護(hù)offset,而對(duì)消息數(shù)據(jù)的處理需要符合不重復(fù)不遺漏的要求時(shí),要采取可靠的偏移量管理機(jī)制,可以通過Kafka底層的low-level接口集,來獲取kafka數(shù)據(jù),并且通過應(yīng)用自行保存和管理offset,保障數(shù)據(jù)消費(fèi)的準(zhǔn)確性、可靠性。筆者參與設(shè)計(jì)開發(fā)的系統(tǒng),對(duì)于計(jì)費(fèi)數(shù)據(jù)要求唯一、準(zhǔn)確,因此單獨(dú)設(shè)計(jì)構(gòu)造了offset管理功能,確保消息的可靠消費(fèi),而對(duì)于短信下發(fā)數(shù)據(jù),則采用了使用kafka提供的offset管理服務(wù)。
2.2 消息的時(shí)序性保障設(shè)計(jì)
在Kafka中,消息以Topic進(jìn)行分組,在Topic下又可以分成多個(gè)partitiong,由此kafka集群中,存在著消息分布。屬于同- Topic的Partition的消息是有序的,分布在不同Topic和Partition上的消息則是無序的。消費(fèi)消息的應(yīng)用對(duì)消息時(shí)序性有嚴(yán)格要求時(shí),應(yīng)采取寫入消息時(shí)保證消息時(shí)序的設(shè)計(jì)方法。使用如下參數(shù)max.in.fiight.requests.p er.connection防止寫入消息時(shí)亂序。
2.3 通過消息組裝設(shè)計(jì),支撐批量數(shù)據(jù)處理
單條消息處理時(shí),客戶端與服務(wù)端會(huì)頻繁發(fā)送數(shù)據(jù)包,海量數(shù)據(jù)且在保證所有副本寫入成功后回執(zhí)的方式下,勢(shì)必帶來性能下降。筆者所在項(xiàng)目為了方便消息管理,同時(shí)解決客戶端與服務(wù)端頻繁發(fā)送數(shù)據(jù)包所帶來的性能下降,將多個(gè)消息內(nèi)容通過JSON的格式組裝成一個(gè)消息,即,一個(gè)消息中包含多個(gè)“消息內(nèi)容”。這樣的消息組裝設(shè)計(jì),可以支撐批量數(shù)據(jù)處理,平衡了性能下降問題。
2.4 應(yīng)用支持消息和文件兩種模式
基于原有系統(tǒng)升級(jí)的話,要考慮應(yīng)用系統(tǒng)支持傳統(tǒng)的文件載體處理模式,同時(shí)這也是對(duì)異常情況的補(bǔ)償機(jī)制。設(shè)計(jì)應(yīng)用系統(tǒng),通過參數(shù)控制,實(shí)現(xiàn)消息或文件的模式間轉(zhuǎn)換。在開發(fā)實(shí)現(xiàn)上,需要在底層kafka讀寫和上層業(yè)務(wù)代碼處理中間,設(shè)計(jì)一層消息處理的類文件操作封裝。這樣每類進(jìn)程的不同通道,都可以通過參數(shù)控制,選擇不同的處理模式。
2.5 消息的異常補(bǔ)償機(jī)制設(shè)計(jì)
kafka集群異常場(chǎng)景比較多,針對(duì)不同場(chǎng)景,需設(shè)計(jì)不同的補(bǔ)償機(jī)制,包括消息丟棄、日志打印、偏移量保存、應(yīng)用退出等異常處理方案。
以筆者項(xiàng)目中超時(shí)的處理為例,提出Consumer異常情況下可參考的設(shè)計(jì)建議。Consumer消費(fèi)時(shí),為了效率,一般會(huì)設(shè)置較短的超時(shí)時(shí)間,此時(shí)consumer連接leader請(qǐng)求metadata信息,給定的超時(shí)響應(yīng)時(shí)間很短,當(dāng)kafka集群出現(xiàn)向leader頻繁下發(fā)metadata信息的情況時(shí),應(yīng)用會(huì)頻繁超時(shí)報(bào)錯(cuò),此時(shí)可能是由于leader與follower同步有積壓導(dǎo)致。設(shè)計(jì)時(shí)可以考慮,設(shè)計(jì)超時(shí)參數(shù)設(shè)置,方便調(diào)節(jié)應(yīng)用超時(shí)響應(yīng)時(shí)長(zhǎng),也可以加大kafka集群leader與follower的同步時(shí)長(zhǎng)參數(shù),從而降低頻繁的metadata更新,進(jìn)而處理超時(shí)問題。
3 結(jié)束語(yǔ)
Kafka技術(shù)因其獨(dú)特的優(yōu)勢(shì),將會(huì)為更多系統(tǒng)帶來實(shí)時(shí)傳輸?shù)膽?yīng)用。并且,它在技術(shù)上的實(shí)用性很強(qiáng),可以強(qiáng)有力地推動(dòng)需要解決高吞吐量、高性能、高實(shí)時(shí)性要求的系統(tǒng)的開發(fā)和設(shè)計(jì)。計(jì)費(fèi)類業(yè)務(wù)成為使用Kafka的重要應(yīng)用,可以促進(jìn)不同業(yè)務(wù)需要的拓展,使不同業(yè)務(wù)都能夠利用Kafka得到實(shí)現(xiàn),從而提高了運(yùn)行效率,推動(dòng)了系統(tǒng)的信息化發(fā)展,對(duì)于提高通信運(yùn)營(yíng)商的IT系統(tǒng)形成強(qiáng)有力的支撐。
參考文獻(xiàn)
[1]王巖,王純,一種基于Kafka的可靠的Consumer的設(shè)計(jì)方案[J],軟件,2016,37 (01): 61-66.