本發(fā)明實(shí)施例涉及大數(shù)據(jù)技術(shù),尤其涉及一種基于kafka的消息處理方法。
背景技術(shù):
Kafka是一種高吞吐量的分布式發(fā)布訂閱消息系統(tǒng),kafka開(kāi)發(fā)的主要目標(biāo)是構(gòu)建一個(gè)用來(lái)處理海量日志、用戶行為和網(wǎng)站運(yùn)營(yíng)統(tǒng)計(jì)等的數(shù)據(jù)處理框架,在結(jié)合了數(shù)據(jù)挖掘、行為分析、運(yùn)營(yíng)監(jiān)控等需求的情況下,需要能夠滿足各種實(shí)時(shí)在線和批量離線處理應(yīng)用場(chǎng)合對(duì)低延遲和批量吞吐性能的要求。
Kafka集群包含一個(gè)或多個(gè)服務(wù)器,這種服務(wù)器被稱為broker,每條發(fā)布到kafka集群的消息都有一個(gè)主題,該主題被稱為topic,每個(gè)topic包含一個(gè)或多個(gè)分區(qū),該分區(qū)被稱為partition,同一topic內(nèi)部的消息按照一定的key和算法被分區(qū)存儲(chǔ)在不同的broker上,消息生產(chǎn)者producer和消費(fèi)者consumer作為客戶端可以在多個(gè)broker上生產(chǎn)或消費(fèi)topic。
目前,kafka度量標(biāo)準(zhǔn)僅針對(duì)單個(gè)客戶端或代理收集,這使得用戶難以跟蹤跨集群的單個(gè)消息的路徑,提供系統(tǒng)性能和行為的完整端到端的場(chǎng)景。然而觀察、測(cè)量和監(jiān)視kafka客戶端行為的能力在生產(chǎn)環(huán)境中很有價(jià)值,這為kafka系統(tǒng)出錯(cuò)后的檢測(cè)分析提供了依據(jù)。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明實(shí)施例提供一種基于kafka的消息處理方法,以解決現(xiàn)有技術(shù)中難以跟蹤跨集群的單個(gè)消息路徑的問(wèn)題。
第一方面,本發(fā)明實(shí)施例提供了一種基于kafka的消息處理方法,應(yīng)用于kafka的生產(chǎn)者,該方法包括:
在發(fā)布消息時(shí),調(diào)用生產(chǎn)者攔截器,所述生產(chǎn)者攔截器用于攔截生產(chǎn)者發(fā)布消息的參數(shù);
將發(fā)布消息的參數(shù)作為參數(shù)記錄輸出。
第二方面,本發(fā)明實(shí)施例還提供了一種基于kafka的消息處理方法,應(yīng)用于kafka的消費(fèi)者,該方法包括:
在訂閱消息時(shí),調(diào)用消費(fèi)者攔截器,所述消費(fèi)者攔截器用于攔截消費(fèi)者訂閱消息的參數(shù);
將訂閱消息的參數(shù)作為參數(shù)記錄輸出。
本發(fā)明實(shí)施例通過(guò)在kafka的生產(chǎn)者與消費(fèi)者架構(gòu)中增加生產(chǎn)者攔截器和消費(fèi)者攔截器,通過(guò)該生產(chǎn)者攔截器在生產(chǎn)者發(fā)布消息時(shí)攔截發(fā)布消息的參數(shù),以及通過(guò)消費(fèi)者攔截器在消費(fèi)者訂閱消息時(shí)攔截訂閱消息的參數(shù),從而攔截生產(chǎn)者和消費(fèi)者在集群中的不同點(diǎn)的消息,繼而觀測(cè)不同的應(yīng)用程序不同的消息度量,實(shí)現(xiàn)跨集群跟蹤消息路徑,為kafka系統(tǒng)出錯(cuò)后的檢測(cè)分析提供了依據(jù)。
附圖說(shuō)明
圖1是本發(fā)明實(shí)施例一中的基于kafka的消息處理方法的流程圖;
圖2是本發(fā)明實(shí)施例一中的基于kafka的消息處理方法的應(yīng)用實(shí)例的流程圖;
圖3是本發(fā)明實(shí)施例二中的基于kafka的消息處理方法的流程圖;
圖4是本發(fā)明實(shí)施例二中的基于kafka的消息處理方法的應(yīng)用實(shí)例的流程圖。
具體實(shí)施方式
下面結(jié)合附圖和實(shí)施例對(duì)本發(fā)明作進(jìn)一步的詳細(xì)說(shuō)明。可以理解的是,此處所描述的具體實(shí)施例僅僅用于解釋本發(fā)明,而非對(duì)本發(fā)明的限定。另外還需要說(shuō)明的是,為了便于描述,附圖中僅示出了與本發(fā)明相關(guān)的部分而非全部結(jié)構(gòu)。
Python是一種面向?qū)ο蟮慕忉屝陀?jì)算機(jī)程序設(shè)計(jì)語(yǔ)言。
實(shí)施例一
圖1為本發(fā)明實(shí)施例一提供的基于kafka的消息處理方法的流程圖,本實(shí)施例可適用于kafka的生產(chǎn)者客戶端,該方法可以由生產(chǎn)者客戶端來(lái)執(zhí)行。
本發(fā)明實(shí)施例一的方法具體包括:
S110、在發(fā)布消息時(shí),調(diào)用生產(chǎn)者攔截器,所述生產(chǎn)者攔截器用于攔截生產(chǎn)者發(fā)布消息的參數(shù);
S120、將發(fā)布消息的參數(shù)作為參數(shù)記錄輸出。
具體的,在Kafka集群中,每條發(fā)布到kafka集群的消息都有一個(gè)主題,該類別被稱為topic,每個(gè)topic包含一個(gè)或多個(gè)分區(qū),該分區(qū)被稱為partition,同一topic內(nèi)部的消息按照一定的key和算法被分區(qū)存儲(chǔ)在不同的broker上,存儲(chǔ)的位置由偏移量表示,按照一定的key和算法處理的過(guò)程稱為鍵值序列化,消息生產(chǎn)者producer和消費(fèi)者consumer作為客戶端可以在多個(gè)broker上生產(chǎn)或消費(fèi)topic。由此,生產(chǎn)者發(fā)布消息的參數(shù)可以包括消息的主題、分區(qū)、偏移量和鍵值。
相應(yīng)的,生產(chǎn)者攔截器包括四種類型:生產(chǎn)者主題攔截器、生產(chǎn)者分區(qū)攔截器、生產(chǎn)者偏移量攔截器和生產(chǎn)者鍵值攔截器,分別用于攔截生產(chǎn)者發(fā)布消息的主題、分區(qū)、偏移量和鍵值。在實(shí)施時(shí),可以根據(jù)需要,選擇對(duì)應(yīng)的攔截器攔截需要的參數(shù)。
進(jìn)一步的,每種類型的生產(chǎn)者攔截器均定義在生產(chǎn)者攔截器列表中,而且每種類型的生產(chǎn)者攔截器的數(shù)量均為至少一個(gè),每個(gè)攔截器都有自己的生命周期,由時(shí)長(zhǎng)表示,也即每個(gè)攔截器在執(zhí)行完攔截操作一定時(shí)間后就會(huì)停止操作。
因此,調(diào)用生產(chǎn)者攔截器包括:
針對(duì)生產(chǎn)者攔截器列表中每種類型的至少一個(gè)生產(chǎn)者攔截器,進(jìn)行依次調(diào)用,其中,在同種類型的至少一個(gè)生產(chǎn)者攔截器中,每個(gè)生產(chǎn)者攔截器還用于將攔截到的參數(shù)傳遞給下一個(gè)生產(chǎn)者攔截器;
相應(yīng)的,將發(fā)布消息的參數(shù)作為參數(shù)記錄輸出包括:
將生產(chǎn)者攔截器列表中每種類型的最后一個(gè)生產(chǎn)者攔截器攔截到的參數(shù),以及最后一個(gè)生產(chǎn)者攔截器從其上一個(gè)生產(chǎn)者攔截器傳遞得到的參數(shù),作為參數(shù)記錄輸出。
具體的,生產(chǎn)者客戶端在發(fā)布消息時(shí),調(diào)用目標(biāo)類型的生產(chǎn)者攔截器用以攔截該目標(biāo)類型的參數(shù),該目標(biāo)類型可以是主題、分區(qū)、偏移量和鍵值中的一個(gè)或多個(gè)。在調(diào)用時(shí),選擇生產(chǎn)者攔截器列表中的第一個(gè)目標(biāo)類型的生產(chǎn)者攔截器進(jìn)行調(diào)用,該攔截器被調(diào)用后,會(huì)持續(xù)攔截生產(chǎn)者發(fā)布消息的目標(biāo)類型的參數(shù),直到到達(dá)該攔截器的操作時(shí)長(zhǎng)為止,之后生產(chǎn)者客戶端會(huì)選擇生產(chǎn)者攔截器列表中的下一個(gè)目標(biāo)類型的生產(chǎn)者攔截器進(jìn)行調(diào)用,接著攔截目標(biāo)類型的參數(shù)。而在此過(guò)程中,已經(jīng)被調(diào)用的生產(chǎn)者攔截器會(huì)將其攔截到的參數(shù)傳遞給下一個(gè)被調(diào)用的生產(chǎn)者攔截器,以此類推,列表中的最后一個(gè)目標(biāo)類型的攔截器會(huì)將其攔截到的目標(biāo)類型的參數(shù),和從其上一個(gè)生產(chǎn)者攔截器傳遞得到的參數(shù),一起作為參數(shù)記錄輸出,從而輸出得到生產(chǎn)者客戶端發(fā)布全部消息的全部目標(biāo)類型的參數(shù)。這些輸出的參數(shù)記錄可以供技術(shù)人員查看、分析,從而為kafka系統(tǒng)出錯(cuò)后的檢測(cè)提供依據(jù)。
在一種優(yōu)選的實(shí)施方式中,每個(gè)生產(chǎn)者攔截器還會(huì)在時(shí)長(zhǎng)結(jié)束之前,判斷所攔截到的參數(shù)中是否存在無(wú)效信息,并在判斷為存在無(wú)效信息時(shí),將無(wú)效信息更改為空值。在kafka中每種參數(shù)的格式都是有標(biāo)準(zhǔn)的,那么明顯不符合該標(biāo)準(zhǔn)的參數(shù)即為無(wú)效信息,此時(shí),會(huì)在相應(yīng)位置上賦值為空,從而避免記錄出錯(cuò)。
基于該優(yōu)選實(shí)施方式可知,生產(chǎn)者攔截器有可能會(huì)修改攔截到的主題、分區(qū)、偏移量和鍵值的記錄,因此,在調(diào)用生產(chǎn)者攔截器的操作中,在同種類型的至少一個(gè)生產(chǎn)者攔截器中,每個(gè)生產(chǎn)者攔截器還用于將攔截到的參數(shù)傳遞給下一個(gè)生產(chǎn)者攔截器,則可以將存在修改的記錄進(jìn)行繼承,從而保存最原始和正確的參數(shù)記錄。
在另一種優(yōu)選的實(shí)施方式中,若調(diào)用的某一個(gè)生產(chǎn)者攔截器拋出異常,為了不丟失該拋出異常的攔截器的參數(shù)記錄,則在生產(chǎn)者攔截器列表的與所述拋出異常的生產(chǎn)者攔截器類型相同的生產(chǎn)者攔截器中,將所述拋出異常的生產(chǎn)者攔截器之前被調(diào)用并無(wú)異常的生產(chǎn)者攔截器攔截到的參數(shù)傳遞給下一個(gè)生產(chǎn)者攔截器,并調(diào)用下一個(gè)生產(chǎn)者攔截器進(jìn)行參數(shù)攔截,從而實(shí)現(xiàn)生產(chǎn)者參數(shù)攔截的持續(xù)性。此外,根據(jù)kafka標(biāo)準(zhǔn),在傳遞參數(shù)時(shí),還需要同時(shí)拋出所述異常給生產(chǎn)者的onAcknowledgement()方法,用于處理該異常,使得元數(shù)據(jù)不為空,從而保證攔截操作的延續(xù)性。
優(yōu)選的,onAcknowledgement()方法在生產(chǎn)者的I/O線程上調(diào)用,攔截器可以在生產(chǎn)者的提交線程上調(diào)用。
本發(fā)明實(shí)施例的基于kafka的消息處理方法,通過(guò)生產(chǎn)者攔截器在生產(chǎn)者發(fā)布消息時(shí)攔截發(fā)布消息的參數(shù),從而攔截生產(chǎn)者在集群中的不同點(diǎn)的消息,繼而觀測(cè)不同的應(yīng)用程序不同的消息度量,實(shí)現(xiàn)跨集群跟蹤消息路徑,為kafka系統(tǒng)出錯(cuò)后的檢測(cè)分析提供了依據(jù)。
圖2為本發(fā)明實(shí)施例一中的基于kafka的消息處理方法的應(yīng)用實(shí)例的流程圖,在該應(yīng)用實(shí)例中,可以在生產(chǎn)者代碼中創(chuàng)建一個(gè)新的類,它將封裝一個(gè)ProducerInterceptor(生產(chǎn)者攔截器)實(shí)例的列表:ProducerInterceptors,因此KafkaProducer將有一個(gè)新成員:ProducerInterceptors<K,V>攔截器。KafkaProducer構(gòu)造函數(shù)將加載在interceptor.classes中指定的攔截器類的實(shí)例。如果interceptor.classes配置沒(méi)有列出任何攔截器類,攔截器列表將為空。
如圖2所示,KafkaProducer.send()調(diào)用Onsend()方法進(jìn)行消息發(fā)布,Onsend()方法在發(fā)布消息時(shí),調(diào)用主題攔截器、分區(qū)攔截器、偏移量攔截器或鍵值攔截器中的一種或多種,分別進(jìn)行主題、分區(qū)、偏移量或鍵值的攔截操作,然后將獲取到的參數(shù)記錄返回給ProducerRecord對(duì)象,ProducerRecord對(duì)象返回給KafkaProducer類。當(dāng)生產(chǎn)者攔截器拋出異常時(shí),Onsend()方法將該異常拋出給onAcknowledgement()處理,Onsend()方法則調(diào)用下一個(gè)與該拋出異常的攔截器類型相同的下一個(gè)生產(chǎn)者攔截器,且該下一個(gè)生產(chǎn)者攔截器獲取到該拋出異常的攔截器的上一個(gè)被調(diào)用并無(wú)異常的生產(chǎn)者攔截器攔截到的參數(shù)。
實(shí)施時(shí),可以根據(jù)kafka集群的規(guī)模、配置和實(shí)際的需求來(lái)設(shè)置生產(chǎn)者攔截器。優(yōu)選的,上述生產(chǎn)者攔截器可以用Python腳本來(lái)實(shí)現(xiàn)。
實(shí)施例二
圖3是本發(fā)明實(shí)施例二中的基于kafka的消息處理方法的流程圖,本實(shí)施例可適用于kafka的消費(fèi)者客戶端,該方法可以由消費(fèi)者客戶端來(lái)執(zhí)行。
如圖3所示,本發(fā)明實(shí)施例二的方法具體包括:
S210、在訂閱消息時(shí),調(diào)用消費(fèi)者攔截器,所述消費(fèi)者攔截器用于攔截消費(fèi)者訂閱消息的參數(shù);
S220、將訂閱消息的參數(shù)作為參數(shù)記錄輸出。
具體的,消費(fèi)訂閱消息的參數(shù)可以包括消息的主題、分區(qū)、偏移量和鍵值。相應(yīng)的,消費(fèi)者攔截器包括四種類型:消費(fèi)者主題攔截器、消費(fèi)者分區(qū)攔截器、消費(fèi)者偏移量攔截器和消費(fèi)者鍵值攔截器,分別用于攔截消費(fèi)者訂閱消息的主題、分區(qū)、偏移量和鍵值。在實(shí)施時(shí),可以根據(jù)需要,選擇對(duì)應(yīng)的攔截器攔截需要的參數(shù)。
進(jìn)一步的,每種類型的消費(fèi)者攔截器均定義在消費(fèi)者攔截器列表中,而且每種類型的消費(fèi)者攔截器的數(shù)量均為至少一個(gè),每個(gè)攔截器都有自己的生命周期,由時(shí)長(zhǎng)表示,也即每個(gè)攔截器在執(zhí)行完攔截操作一定時(shí)間后就會(huì)停止操作。
因此,調(diào)用消費(fèi)者攔截器包括:
針對(duì)消費(fèi)者攔截器列表中每種類型的至少一個(gè)消費(fèi)者攔截器,進(jìn)行依次調(diào)用,其中,在同種類型的至少一個(gè)消費(fèi)攔截器中,每個(gè)消費(fèi)者攔截器還用于將攔截到的參數(shù)傳遞給下一個(gè)消費(fèi)者攔截器;
相應(yīng)的,將訂閱消息的參數(shù)作為參數(shù)記錄輸出包括:
將消費(fèi)者攔截器列表中每種類型的最后一個(gè)消費(fèi)者攔截器攔截到的參數(shù),以及最后一個(gè)消費(fèi)者攔截器從其上一個(gè)消費(fèi)者攔截器傳遞得到的參數(shù),作為參數(shù)記錄輸出。
具體的,消費(fèi)者客戶端在訂閱消息時(shí),調(diào)用目標(biāo)類型的消費(fèi)者攔截器用以攔截該目標(biāo)類型的參數(shù),該目標(biāo)類型可以是主題、分區(qū)、偏移量和鍵值中的一個(gè)或多個(gè)。在調(diào)用時(shí),選擇消費(fèi)者攔截器列表中的第一個(gè)目標(biāo)類型的消費(fèi)者攔截器進(jìn)行調(diào)用,該攔截器被調(diào)用后,會(huì)持續(xù)攔截消費(fèi)者訂閱消息的目標(biāo)類型的參數(shù),直到到達(dá)該攔截器的操作時(shí)長(zhǎng)為止,之后消費(fèi)者客戶端會(huì)選擇消費(fèi)者攔截器列表中的下一個(gè)目標(biāo)類型的消費(fèi)者攔截器進(jìn)行調(diào)用,接著攔截目標(biāo)類型的參數(shù)。而在此過(guò)程中,已經(jīng)被調(diào)用的消費(fèi)者攔截器會(huì)將其攔截到的參數(shù)傳遞給下一個(gè)被調(diào)用的消費(fèi)者攔截器,以此類推,列表中的最后一個(gè)目標(biāo)類型的攔截器會(huì)將其攔截到的目標(biāo)類型的參數(shù),和從其上一個(gè)消費(fèi)者攔截器傳遞得到的參數(shù),一起作為參數(shù)記錄輸出,從而輸出得到消費(fèi)者客戶端訂閱全部消息的全部目標(biāo)類型的參數(shù)。這些輸出的參數(shù)記錄可以供技術(shù)人員查看、分析,從而為kafka系統(tǒng)出錯(cuò)后的檢測(cè)提供依據(jù)。
在一種優(yōu)選的實(shí)施方式中,每個(gè)消費(fèi)者攔截器還會(huì)在時(shí)長(zhǎng)結(jié)束之前,判斷所攔截到的參數(shù)中是否存在無(wú)效信息,并在判斷為存在無(wú)效信息時(shí),將無(wú)效信息更改為空值。在kafka中每種參數(shù)的格式都是有標(biāo)準(zhǔn)的,那么明顯不符合該標(biāo)準(zhǔn)的參數(shù)即為無(wú)效信息,此時(shí),會(huì)在相應(yīng)位置上賦值為空,從而避免記錄出錯(cuò)。
基于該優(yōu)選實(shí)施方式可知,消費(fèi)者攔截器有可能會(huì)修改攔截到的主題、分區(qū)、偏移量和鍵值的記錄,因此,在調(diào)用消費(fèi)者攔截器的操作中,在同種類型的至少一個(gè)消費(fèi)者攔截器中,每個(gè)消費(fèi)者攔截器還用于將攔截到的參數(shù)傳遞給下一個(gè)消費(fèi)者攔截器,則可以將存在修改的記錄進(jìn)行繼承,從而保存最原始和正確的參數(shù)記錄。
在另一種優(yōu)選的實(shí)施方式中,若調(diào)用的某一個(gè)消費(fèi)者攔截器拋出異常,為了不丟失該拋出異常的攔截器的參數(shù)記錄,則在消費(fèi)者攔截器列表的與所述拋出異常的消費(fèi)者攔截器類型相同的消費(fèi)者攔截器中,將所述拋出異常的消費(fèi)者攔截器之前被調(diào)用并無(wú)異常的消費(fèi)者攔截器攔截到的參數(shù)傳遞給下一個(gè)消費(fèi)者攔截器,并調(diào)用下一個(gè)消費(fèi)者攔截器進(jìn)行參數(shù)攔截,從而實(shí)現(xiàn)消費(fèi)者參數(shù)攔截的持續(xù)性。此外,根據(jù)kafka標(biāo)準(zhǔn),在傳遞參數(shù)時(shí),還需要同時(shí)拋出所述異常給消費(fèi)者的Broker.oncommit()方法,用于處理該異常,使得元數(shù)據(jù)不為空,從而保證攔截操作的延續(xù)性。
優(yōu)選的,由于消費(fèi)者是單線程的,因此,消費(fèi)者攔截器可以在該單線程上調(diào)用。
本發(fā)明實(shí)施例的基于kafka的消息處理方法,通過(guò)消費(fèi)者攔截器在消費(fèi)者訂閱消息時(shí)攔截訂閱消息的參數(shù),從而攔截消費(fèi)者在集群中的不同點(diǎn)的消息,繼而觀測(cè)不同的應(yīng)用程序不同的消息度量,實(shí)現(xiàn)跨集群跟蹤消息路徑,為kafka系統(tǒng)出錯(cuò)后的檢測(cè)分析提供了依據(jù)。
圖4是本發(fā)明實(shí)施例二中的基于kafka的消息處理方法的應(yīng)用實(shí)例的流程圖,在該應(yīng)用實(shí)例中,可以在消費(fèi)者代碼中創(chuàng)建一個(gè)新的類,它將封裝一個(gè)ConsumerInterceptor(消費(fèi)者攔截器)實(shí)例的列表:ConsumerInterceptors,KafkaConsumer將有一個(gè)新成員:ConsumerInterceptors<K,V>interceptors。KafkaConsumer構(gòu)造函數(shù)將加載在interceptor.classes中指定的攔截器類的實(shí)例。如果interceptor.classes配置沒(méi)有列出任何攔截器類,攔截器列表將為空。
如圖4所示,KafkaConsumer.pull()調(diào)用Onconsume()方法進(jìn)行消息訂閱,Onconsume()方法在訂閱消息時(shí),調(diào)用主題攔截器、分區(qū)攔截器、偏移量攔截器或鍵值攔截器中的一種或多種,分別進(jìn)行主題、分區(qū)、偏移量或鍵值的攔截操作,然后將獲取到的參數(shù)記錄返回給ConsumerRecord對(duì)象,ConsumerRecord對(duì)象返回給KafkaConsumer類。當(dāng)消費(fèi)者攔截器拋出異常時(shí),Onconsume()方法將該異常拋出給Broker.oncommit()處理,Onconsume()方法則調(diào)用下一個(gè)與該拋出異常的攔截器類型相同的下一個(gè)消費(fèi)者攔截器,且該下一個(gè)消費(fèi)者攔截器獲取到該拋出異常的攔截器的上一個(gè)被調(diào)用并無(wú)異常的消費(fèi)者攔截器攔截到的參數(shù)。
實(shí)施時(shí),可以根據(jù)kafka集群的規(guī)模、配置和實(shí)際的需求來(lái)設(shè)置消費(fèi)者攔截器。優(yōu)選的,上述消費(fèi)者攔截器可以用Python腳本來(lái)實(shí)現(xiàn)。
注意,上述僅為本發(fā)明的較佳實(shí)施例及所運(yùn)用技術(shù)原理。本領(lǐng)域技術(shù)人員會(huì)理解,本發(fā)明不限于這里所述的特定實(shí)施例,對(duì)本領(lǐng)域技術(shù)人員來(lái)說(shuō)能夠進(jìn)行各種明顯的變化、重新調(diào)整和替代而不會(huì)脫離本發(fā)明的保護(hù)范圍。因此,雖然通過(guò)以上實(shí)施例對(duì)本發(fā)明進(jìn)行了較為詳細(xì)的說(shuō)明,但是本發(fā)明不僅僅限于以上實(shí)施例,在不脫離本發(fā)明構(gòu)思的情況下,還可以包括更多其他等效實(shí)施例,而本發(fā)明的范圍由所附的權(quán)利要求范圍決定。