一種心跳包的處理方法和裝置制造方法
【專利摘要】本發(fā)明涉及一種心跳包處理的方法和裝置,包括:一個(gè)或多個(gè)執(zhí)行線程、以及獨(dú)立線程;所述獨(dú)立線程依次獲取多個(gè)設(shè)備上報(bào)的一個(gè)或多個(gè)心跳包并發(fā)送至對(duì)應(yīng)的所述執(zhí)行線程;一個(gè)或多個(gè)所述執(zhí)行線程,根據(jù)各自對(duì)應(yīng)的散列表和心跳包隊(duì)列,并行地對(duì)對(duì)應(yīng)的心跳包執(zhí)行處理。本發(fā)明利用獨(dú)立線程獲取并分發(fā)心跳包,并使用多個(gè)執(zhí)行線程并行的處理來自多個(gè)設(shè)備的心跳包,提高了心跳包的處理效率;并且在變更當(dāng)前設(shè)備狀態(tài)時(shí),運(yùn)用散列表和心跳隊(duì)列,避免了對(duì)集群中每一個(gè)設(shè)備的遍歷,大幅度減少了系統(tǒng)的運(yùn)算量。
【專利說明】一種心跳包的處理方法和裝置
【技術(shù)領(lǐng)域】
[0001]本申請(qǐng)涉及數(shù)據(jù)處理領(lǐng)域,尤其涉及一種心跳包的處理方法和裝置。
【背景技術(shù)】
[0002]心跳包是指客戶端定時(shí)上報(bào)簡(jiǎn)單的信息給服務(wù)器端,以此告訴服務(wù)器,該客戶端處于在線狀態(tài)。例如,客戶端每隔幾分鐘上報(bào)一個(gè)信息(可稱為心跳包)給心跳服務(wù)器,如果該心跳服務(wù)器在預(yù)定時(shí)間內(nèi)(如,I分鐘內(nèi))沒有收到客戶端信息,則表示該客戶端已經(jīng)離線。
[0003]現(xiàn)有的心跳服務(wù)器采用以下處理方式來管理心跳:在進(jìn)程中使用“樹”來存儲(chǔ)每個(gè)設(shè)備最近一次上報(bào)來的心跳包所包含的信息,該“樹”可以是二叉查找樹,其中,樹中的每個(gè)結(jié)點(diǎn)將會(huì)記錄3個(gè)信息,分別為設(shè)備名稱、最近一次上報(bào)的時(shí)間、當(dāng)前狀態(tài)。
[0004]并且,現(xiàn)有的處理方式為多個(gè)線程共同操作該樹,其中一些線程負(fù)責(zé)處理設(shè)備上報(bào)來心跳包,并在接收到一個(gè)心跳包后更新樹中的與該心跳包對(duì)應(yīng)的結(jié)點(diǎn),例如,發(fā)現(xiàn)該心跳包對(duì)應(yīng)的設(shè)備在樹中不存在、或者該心跳包對(duì)應(yīng)的設(shè)備的狀態(tài)為線下時(shí),則在樹中添加該設(shè)備的結(jié)點(diǎn)或是將該設(shè)備的當(dāng)前設(shè)備狀態(tài)置為線上;另有一些線程負(fù)責(zé)遍歷樹中的每一個(gè)節(jié)點(diǎn),將各個(gè)設(shè)備的上次心跳時(shí)間與當(dāng)前系統(tǒng)時(shí)間做比較,若發(fā)現(xiàn)某個(gè)設(shè)備在一定時(shí)間內(nèi)沒有上報(bào)心跳包,則將該設(shè)備的狀態(tài)設(shè)置為下線。
[0005]但是,這種處理方式效率并不高,這種低效體現(xiàn)在兩點(diǎn):1、多線程操作同一棵樹,必須使用“鎖”來保護(hù)線程對(duì)該共享資源(樹)的訪問,所述多個(gè)線程只有獲得“鎖”才能對(duì)該樹進(jìn)行操作,這限制了多個(gè)線程之間的并發(fā)性,尤其是多個(gè)線程的執(zhí)行所帶來的無謂的進(jìn)程間切換(如Linux操作系統(tǒng)中,進(jìn)程切換等價(jià)于線程切換)開銷將會(huì)很可觀。2、線程對(duì)樹的遍歷操作運(yùn)算量過大,尤其是集群內(nèi)含有大量的設(shè)備時(shí),換言之,所述的樹中包含大量的節(jié)點(diǎn)時(shí),線程要對(duì)樹中的每一個(gè)節(jié)點(diǎn)進(jìn)行遍歷,運(yùn)算量過大。這樣,以上的心跳包處理方式導(dǎo)致心跳服務(wù)器性能較低,不能處理大量的心跳包。
[0006]在云計(jì)算環(huán)境下,一個(gè)大集群(例如阿里云彈性計(jì)算集群)內(nèi),可以包含2萬臺(tái)物理機(jī)和80萬臺(tái)虛擬機(jī),而且這個(gè)數(shù)據(jù)還會(huì)隨著物理機(jī)和虛擬機(jī)數(shù)量的增加而不斷擴(kuò)大,這樣,處理各個(gè)設(shè)備的心跳包所需要的運(yùn)算量也越來越大,這導(dǎo)致了集群的心跳服務(wù)器性能的局限性。若利用上述心跳包處理方式,可以使用多個(gè)心跳服務(wù)器組成一個(gè)心跳服務(wù)器集群才能完成處理,但是,在現(xiàn)有技術(shù)中,對(duì)于心跳服務(wù)器集群的構(gòu)建還存在很多技術(shù)問題,如,對(duì)多個(gè)心跳服務(wù)器進(jìn)行集群構(gòu)建設(shè)計(jì)、數(shù)據(jù)同步設(shè)計(jì)等,而且,在系統(tǒng)中添加多個(gè)心跳服務(wù)器提高了系統(tǒng)成本。
【發(fā)明內(nèi)容】
[0007]本申請(qǐng)的主要目的在于提供一種心跳包的處理方法和裝置,以解決現(xiàn)有技術(shù)存在的多個(gè)線程不能并發(fā)對(duì)多個(gè)心跳包進(jìn)行處理,而且遍歷大量設(shè)備的狀態(tài)運(yùn)算量過大的問題。
[0008]為了解決上述技術(shù)問題,本申請(qǐng)的目的是通過以下技術(shù)方案實(shí)現(xiàn)的:
[0009]本申請(qǐng)?zhí)峁┝艘环N心跳包處理的方法,包括以下步驟:一個(gè)或多個(gè)執(zhí)行線程、以及獨(dú)立線程;所述獨(dú)立線程依次獲取多個(gè)設(shè)備上報(bào)的一個(gè)或多個(gè)心跳包并發(fā)送至對(duì)應(yīng)的所述執(zhí)行線程;一個(gè)或多個(gè)所述執(zhí)行線程,根據(jù)各自對(duì)應(yīng)的散列表和心跳包隊(duì)列,并行地對(duì)對(duì)應(yīng)的心跳包執(zhí)行處理。
[0010]優(yōu)選地,在根據(jù)本申請(qǐng)所述的方法中,所述心跳包至少包括所述心跳包的上報(bào)時(shí)間、所述心跳包對(duì)應(yīng)的設(shè)備的IP地址;所述散列表記錄對(duì)應(yīng)的執(zhí)行線程接收的每一個(gè)心跳包對(duì)應(yīng)的設(shè)備的設(shè)備信息;其中,所述設(shè)備信息包括:所述心跳包的最近一次上報(bào)時(shí)間、所述心跳包對(duì)應(yīng)的設(shè)備的當(dāng)前設(shè)備狀態(tài);所述心跳包隊(duì)列順序存儲(chǔ)對(duì)應(yīng)的執(zhí)行線程接收的每一個(gè)心跳包的心跳包信息;其中,所述心跳包隊(duì)列的心跳包信息包括:所述心跳包的上報(bào)時(shí)間。
[0011]優(yōu)選地,根據(jù)本申請(qǐng)所述的方法,所述獨(dú)立線程依次獲取多個(gè)設(shè)備上報(bào)的多個(gè)心跳包的步驟,包括:所述獨(dú)立線程根據(jù)每一個(gè)所述心跳包中的IP地址,將所述各個(gè)心跳包發(fā)送至與其對(duì)應(yīng)的執(zhí)行線程中。
[0012]優(yōu)選地,在根據(jù)本申請(qǐng)所述的方法中,將所述心跳包中的IP地址轉(zhuǎn)化為長(zhǎng)整型數(shù)字,并將所述長(zhǎng)整型數(shù)字與執(zhí)行線程的數(shù)量取模,并得到取模結(jié)果;以及基于所述取模結(jié)果,所述獨(dú)立線程將所述心跳包發(fā)送至與該取模結(jié)果存在關(guān)聯(lián)關(guān)系的執(zhí)行線程中。
[0013]優(yōu)選地,根據(jù)本申請(qǐng)所述的方法,所述一個(gè)或多個(gè)所述執(zhí)行線程根據(jù)各自對(duì)應(yīng)的散列表和心跳包隊(duì)列并行地對(duì)對(duì)應(yīng)的心跳包執(zhí)行處理的步驟,包括:查詢所述散列表中與所述心跳包對(duì)應(yīng)的設(shè)備的當(dāng)前設(shè)備狀態(tài),并根據(jù)所述心跳包更新所述散列表。
[0014]優(yōu)選地,根據(jù)本申請(qǐng)所述的方法,所述根據(jù)所述心跳包更新所述散列表的步驟,包括:若與所述心跳包對(duì)應(yīng)的設(shè)備的當(dāng)前設(shè)備狀態(tài)是線下,則將所述設(shè)備的當(dāng)前設(shè)備狀態(tài)置為線上并根據(jù)所述心跳包的上報(bào)時(shí)間更新所述設(shè)備的最近一次上報(bào)時(shí)間;若與所述心跳包對(duì)應(yīng)的設(shè)備的當(dāng)前設(shè)備狀態(tài)是線上,則根據(jù)所述心跳包的上報(bào)時(shí)間更新所述設(shè)備的最近一次上報(bào)時(shí)間;以及若在散列表中不包含所述心跳包對(duì)應(yīng)的設(shè)備的設(shè)備信息,則根據(jù)所述心跳包,在散列表中新建與所述心跳包對(duì)應(yīng)的設(shè)備的設(shè)備信息,并將所述設(shè)備的當(dāng)前設(shè)備狀態(tài)置于線上。
[0015]優(yōu)選地,根據(jù)本申請(qǐng)所述的方法,所述一個(gè)或多個(gè)所述執(zhí)行線程根據(jù)各自對(duì)應(yīng)的散列表和心跳包隊(duì)列并行地對(duì)對(duì)應(yīng)的心跳包執(zhí)行處理的步驟,包括:對(duì)所述心跳包隊(duì)列進(jìn)行分析,并根據(jù)分析結(jié)果更新所述散列表中所述設(shè)備的設(shè)備當(dāng)前狀態(tài)。
[0016]優(yōu)選地,根據(jù)本申請(qǐng)所述的方法,所述對(duì)所述心跳包隊(duì)列進(jìn)行分析的步驟,包括:在所述心跳包隊(duì)列中,順次查詢所述心跳包的上報(bào)時(shí)間;根據(jù)所述心跳包的上報(bào)時(shí)間,確定與所述心跳包對(duì)應(yīng)的設(shè)備的當(dāng)前設(shè)備狀態(tài)。
[0017]優(yōu)選地,根據(jù)本申請(qǐng)所述的方法,所述根據(jù)所述心跳包的上報(bào)時(shí)間,確定與所述心跳包對(duì)應(yīng)的設(shè)備的當(dāng)前設(shè)備狀態(tài)的步驟,包括:若當(dāng)前時(shí)間與該心跳包的上報(bào)時(shí)間的差小于彈性時(shí)間,則所述心跳包對(duì)應(yīng)的設(shè)備的當(dāng)前設(shè)備狀態(tài)為線上;若當(dāng)前時(shí)間與該心跳包的上報(bào)時(shí)間的差大于彈性時(shí)間,則查詢所述心跳包對(duì)應(yīng)的設(shè)備在散列表中的設(shè)備信息;若心跳包的上報(bào)時(shí)間小于所述最近一次上報(bào)時(shí)間,則保持與所述心跳包對(duì)應(yīng)的設(shè)備的當(dāng)前設(shè)備狀態(tài)為線上;若心跳包的上報(bào)時(shí)間等于所述最近一次上報(bào)時(shí)間,則將與所述心跳包對(duì)應(yīng)的設(shè)備的當(dāng)前設(shè)備狀態(tài)置于線下。
[0018]本申請(qǐng)還提供了一種心跳包處理的裝置,包括:一個(gè)或多個(gè)執(zhí)行模塊,以及獨(dú)立模塊;所述獨(dú)立模塊,用于依次獲取多個(gè)設(shè)備上報(bào)的多個(gè)心跳包;并將每一個(gè)所述心跳包發(fā)送至對(duì)應(yīng)的所述執(zhí)行模塊;一個(gè)或多個(gè)所述執(zhí)行模塊根據(jù)各自對(duì)應(yīng)的散列表和心跳包隊(duì)列并行地對(duì)對(duì)應(yīng)的心跳包執(zhí)行處理。
[0019]優(yōu)選地,在根據(jù)本申請(qǐng)所述的裝置中,所述心跳包至少包括所述心跳包的上報(bào)時(shí)間、所述心跳包對(duì)應(yīng)的設(shè)備的IP地址;所述散列表記錄對(duì)應(yīng)的執(zhí)行線程接收的每一個(gè)心跳包對(duì)應(yīng)的設(shè)備的設(shè)備信息,其中,所述設(shè)備信息包括:所述心跳包的最近一次上報(bào)時(shí)間、所述心跳包對(duì)應(yīng)的設(shè)備的當(dāng)前設(shè)備狀態(tài);所述心跳包隊(duì)列順序存儲(chǔ)對(duì)應(yīng)的執(zhí)行線程接收的每一個(gè)心跳包的心跳包信息,其中,所述心跳包隊(duì)列的心跳包信息包括:所述心跳包的上報(bào)時(shí)間。
[0020]優(yōu)選地,在根據(jù)本申請(qǐng)所述的裝置中,所述獨(dú)立模塊還被配置成:所述獨(dú)立模塊根據(jù)每一個(gè)所述心跳包中的IP地址,將所述各個(gè)心跳包發(fā)送至與其對(duì)應(yīng)的執(zhí)行模塊中。
[0021]優(yōu)選地,在根據(jù)本申請(qǐng)所述的裝置中,所述執(zhí)行模塊還被配置成:查詢所述散列表中與所述心跳包對(duì)應(yīng)的設(shè)備的當(dāng)前設(shè)備狀態(tài),并根據(jù)所述心跳包更新所述散列表。
[0022]優(yōu)選地,在根據(jù)本申請(qǐng)所述的裝置中,所述執(zhí)行模塊還被配置成:對(duì)所述心跳包隊(duì)列進(jìn)行分析,并根據(jù)分析結(jié)果更新所述散列表中所述設(shè)備的設(shè)備當(dāng)前狀態(tài)。
[0023]與現(xiàn)有技術(shù)相比,根據(jù)本申請(qǐng)的技術(shù)方案存在以下有益效果:
[0024]本申請(qǐng)利用獨(dú)立線程獲取并分發(fā)心跳包,并使用多個(gè)執(zhí)行線程并行的處理來自多個(gè)設(shè)備的心跳包,提高了心跳包的處理效率;
[0025]本申請(qǐng)?jiān)谧兏?dāng)前設(shè)備狀態(tài)時(shí),運(yùn)用散列表和心跳隊(duì)列,避免了對(duì)集群中每一個(gè)設(shè)備的遍歷,大幅度減少了系統(tǒng)的運(yùn)算量。
【專利附圖】
【附圖說明】
[0026]此處所說明的附圖用來提供對(duì)本申請(qǐng)的進(jìn)一步理解,構(gòu)成本申請(qǐng)的一部分,本申請(qǐng)的示意性實(shí)施例及其說明用于解釋本申請(qǐng),并不構(gòu)成對(duì)本申請(qǐng)的不當(dāng)限定。在附圖中:
[0027]圖1是本申請(qǐng)實(shí)施例的心跳包處理的方法的流程圖;
[0028]圖2是本申請(qǐng)實(shí)施例的心跳包處理的散列表的示意圖;
[0029]圖3是本申請(qǐng)實(shí)施例的心跳包處理的心跳包隊(duì)列的示意圖;
[0030]圖4是本申請(qǐng)實(shí)施例的更新散列表的步驟的流程圖;
[0031]圖5是本申請(qǐng)實(shí)施例的分析心跳包隊(duì)列的步驟的流程圖;以及
[0032]圖6是本申請(qǐng)實(shí)施例的心跳包處理的裝置的示意圖。
【具體實(shí)施方式】
[0033]本申請(qǐng)的主要思想在于,提供多個(gè)線程,設(shè)置其中一個(gè)線程為獨(dú)立線程,其余多個(gè)線程為執(zhí)行線程,其中,獨(dú)立線程獲取心跳包,并發(fā)送給對(duì)應(yīng)的執(zhí)行線程,每一個(gè)執(zhí)行線程包含對(duì)應(yīng)的散列表和心跳包隊(duì)列,根據(jù)所述散列表和心跳包隊(duì)列,多個(gè)執(zhí)行線程并行的處理心跳包,從而達(dá)到及時(shí)監(jiān)控集群中大量設(shè)備的線上和線下狀態(tài)的變化。
[0034]在本申請(qǐng)一個(gè)典型的配置中,計(jì)算設(shè)備包括一個(gè)或多個(gè)處理器(CPU)、輸入/輸出接口、網(wǎng)絡(luò)接口和內(nèi)存。
[0035]內(nèi)存可能包括計(jì)算機(jī)可讀介質(zhì)中的非永久性存儲(chǔ)器,隨機(jī)存取存儲(chǔ)器(RAM)和/或非易失性內(nèi)存等形式,如只讀存儲(chǔ)器(ROM)或閃存(flash RAM)。內(nèi)存是計(jì)算機(jī)可讀介質(zhì)的示例。
[0036]計(jì)算機(jī)可讀介質(zhì)包括永久性和非永久性、可移動(dòng)和非可移動(dòng)媒體可以由任何方法或技術(shù)來實(shí)現(xiàn)信息存儲(chǔ)。信息可以是計(jì)算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序的模塊或其他數(shù)據(jù)。計(jì)算機(jī)的存儲(chǔ)介質(zhì)的例子包括,但不限于相變內(nèi)存(PRAM)、靜態(tài)隨機(jī)存取存儲(chǔ)器(SRAM)、動(dòng)態(tài)隨機(jī)存取存儲(chǔ)器(DRAM)、其他類型的隨機(jī)存取存儲(chǔ)器(RAM)、只讀存儲(chǔ)器(ROM)、電可擦除可編程只讀存儲(chǔ)器(EEPR0M)、快閃記憶體或其他內(nèi)存技術(shù)、只讀光盤只讀存儲(chǔ)器(CD-ROM)、數(shù)字多功能光盤(DVD)或其他光學(xué)存儲(chǔ)、磁盒式磁帶,磁帶磁磁盤存儲(chǔ)或其他磁性存儲(chǔ)設(shè)備或任何其他非傳輸介質(zhì),可用于存儲(chǔ)可以被計(jì)算設(shè)備訪問的信息。按照本文中的界定,計(jì)算機(jī)可讀介質(zhì)不包括非暫存電腦可讀媒體(transitory media),如調(diào)制的數(shù)據(jù)信號(hào)和載波。
[0037]為使本申請(qǐng)的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,以下結(jié)合附圖及具體實(shí)施例,對(duì)本申請(qǐng)作進(jìn)一步地詳細(xì)說明。
[0038]根據(jù)本申請(qǐng)的實(shí)施例,提供了一種心跳包處理的方法。
[0039]參考圖1,圖1是本申請(qǐng)實(shí)施例的心跳包處理的方法的流程圖。
[0040]在大集群環(huán)境中,包括大量設(shè)備,如:物理機(jī)和虛擬機(jī),為了及時(shí)監(jiān)控設(shè)備的當(dāng)前設(shè)備狀態(tài),可以利用心跳服務(wù)器接收集群中設(shè)備定時(shí)發(fā)送的心跳包,當(dāng)心跳服務(wù)器可以收到設(shè)備定時(shí)發(fā)送的心跳包時(shí),可以確定該設(shè)備的當(dāng)前設(shè)備狀態(tài)為線上,若在一段時(shí)間內(nèi),未收到來自設(shè)備發(fā)送的心跳包時(shí),則確定該設(shè)備的當(dāng)前設(shè)備狀態(tài)為線下。例如,聊天工具(QQ、阿里旺旺、MSN等),若客戶端定時(shí)向心跳服務(wù)器發(fā)送心跳包,則表示用戶在線,若在一定時(shí)間內(nèi),客戶端未向心跳服務(wù)器發(fā)送心跳包,則表示用戶已經(jīng)下線;又例如,阿里云彈性計(jì)算環(huán)境中擁有許多臺(tái)虛擬機(jī),若虛擬機(jī)定時(shí)向心跳服務(wù)器發(fā)送心跳包,則表示虛擬機(jī)在線,用戶可以正常使用他擁有的虛擬機(jī),若在一定時(shí)間內(nèi),一臺(tái)虛擬機(jī)未向心跳服務(wù)器發(fā)送心跳包,則表示虛擬機(jī)已經(jīng)下線,彈性計(jì)算系統(tǒng)將會(huì)對(duì)虛擬機(jī)自動(dòng)執(zhí)行各種故障恢復(fù)方案。
[0041]由于在集群中設(shè)備數(shù)量巨大,系統(tǒng)可以并發(fā)多個(gè)線程,由該多個(gè)線程并行對(duì)接收的大量心跳包執(zhí)行操作。本申請(qǐng)可以設(shè)置其中某一個(gè)線程為獨(dú)立線程,負(fù)責(zé)獲取并分發(fā)心跳包,其余的一個(gè)或多個(gè)線程為執(zhí)行線程,負(fù)責(zé)處理心跳包。進(jìn)一步地,所述獨(dú)立線程可以在分發(fā)心跳包時(shí),對(duì)一個(gè)或多個(gè)執(zhí)行線程進(jìn)行負(fù)載(心跳包)均衡;而每個(gè)執(zhí)行線程可以單獨(dú)處理接收到的所述心跳包,并及時(shí)更新設(shè)備的當(dāng)前設(shè)備狀態(tài)。
[0042]下面對(duì)該心跳包處理的方式進(jìn)行詳細(xì)描述。
[0043]步驟S102,通過獨(dú)立線程依次獲取多個(gè)設(shè)備上報(bào)的多個(gè)心跳包。
[0044]心跳服務(wù)器接收多個(gè)設(shè)備上報(bào)的多個(gè)心跳包,并將每一個(gè)心跳包置于數(shù)據(jù)緩沖區(qū)中。當(dāng)心跳包服務(wù)器處理系統(tǒng)(以下簡(jiǎn)稱系統(tǒng))處理心跳包時(shí),可以并發(fā)開啟多個(gè)線程,為該多個(gè)線程中每一個(gè)線程設(shè)置任務(wù),并且并行處理對(duì)應(yīng)的心跳包。比如,可以將所述并發(fā)開啟的多個(gè)線程設(shè)置為一個(gè)或多個(gè)執(zhí)行線程、以及獨(dú)立線程,利用該獨(dú)立線程來依次獲取多個(gè)設(shè)備上報(bào)的多個(gè)心跳包。每一個(gè)設(shè)備上報(bào)的心跳包還至少可以包括:該心跳包的上報(bào)時(shí)間、該心跳包對(duì)應(yīng)的設(shè)備(如:上報(bào)該心跳包的設(shè)備)的設(shè)備名稱、該心跳包對(duì)應(yīng)的設(shè)備的IP地址等各種參數(shù)(數(shù)據(jù)/信息)。進(jìn)一步地,可以在多個(gè)線程中,預(yù)設(shè)一個(gè)線程作為獨(dú)立線程,而剩余的一個(gè)或多個(gè)線程作為執(zhí)行線程。獨(dú)立線程可以從已經(jīng)存儲(chǔ)了心跳包的數(shù)據(jù)緩沖區(qū)中獲得各個(gè)心跳包,并將各個(gè)心跳包發(fā)送給相應(yīng)的執(zhí)行線程,以便執(zhí)行線程能夠處理各個(gè)心跳包。而這些執(zhí)行線程對(duì)所述心跳包進(jìn)行心跳包處理,則比如:接收獨(dú)立線程發(fā)送來的心跳包,新建或者變更上報(bào)該心跳包的設(shè)備的狀態(tài)、對(duì)接收到的多個(gè)心跳包組成的心跳包隊(duì)列進(jìn)行分析等等。
[0045]與現(xiàn)有技術(shù)不同的是,本申請(qǐng)所述的多個(gè)線程(獨(dú)立線程、執(zhí)行線程)可以并行的進(jìn)行數(shù)據(jù)操作,避免了多個(gè)線程由于未搶到“鎖”進(jìn)入休眠期(即,同一時(shí)刻只有一個(gè)線程進(jìn)行數(shù)據(jù)操作),造成的心跳包處理效率低的問題;并且采用單獨(dú)一個(gè)獨(dú)立線程負(fù)責(zé)從數(shù)據(jù)緩沖區(qū)獲取心跳包,避免了數(shù)據(jù)緩沖區(qū)中的心跳包由于獲取不及時(shí)造成的丟包現(xiàn)象。
[0046]獨(dú)立線程獲取所述數(shù)據(jù)緩沖區(qū)中的心跳包,進(jìn)一步地,獨(dú)立線程可以復(fù)制所述數(shù)據(jù)緩沖區(qū)中的心跳包,并且系統(tǒng)釋放該心跳包處于所述數(shù)據(jù)緩沖區(qū)中的存儲(chǔ)空間,以此保證數(shù)據(jù)緩沖區(qū)有足夠的空間可以存放來自設(shè)備上報(bào)的心跳包。
[0047]需要說明的是,一個(gè)或多個(gè)執(zhí)行線程的數(shù)量可以根據(jù)系統(tǒng)具有的CPU核數(shù)決定,執(zhí)行線程的數(shù)量?jī)?yōu)選地小于或等于系統(tǒng)CPU核數(shù)。這樣,當(dāng)一個(gè)執(zhí)行線程在滿負(fù)荷運(yùn)行而全程占用CPU時(shí),不影響其他執(zhí)行線程的運(yùn)行,以此提高系統(tǒng)性能。
[0048]步驟S104,獨(dú)立線程將每一個(gè)心跳包發(fā)送至對(duì)應(yīng)的執(zhí)行線程。
[0049]這里,獨(dú)立線程可以根據(jù)每一個(gè)心跳包中的參數(shù)信息,例如IP地址等,將各個(gè)心跳包,發(fā)送至與其對(duì)應(yīng)的執(zhí)行線程中,接收到心跳包的執(zhí)行線程執(zhí)行該心跳包的處理。
[0050]發(fā)送心跳包給對(duì)應(yīng)的執(zhí)行線程,比如,可以將心跳包中的IP地址轉(zhuǎn)化為長(zhǎng)整型數(shù)字,并將所述長(zhǎng)整型數(shù)字與執(zhí)行線程的數(shù)量取模,并得到取模結(jié)果。這里,可以預(yù)先對(duì)各種取模結(jié)果進(jìn)行分析,并預(yù)先將每一種取模結(jié)果與所述多個(gè)執(zhí)行線程之一進(jìn)行關(guān)聯(lián),從而獨(dú)立線程可以基于如所述心跳包對(duì)應(yīng)的設(shè)備的IP地址等參數(shù)信息轉(zhuǎn)化取模得到的取模結(jié)果,將該心跳包發(fā)送至與該取模結(jié)果存在關(guān)聯(lián)關(guān)系的執(zhí)行線程中去。優(yōu)選地,還可以預(yù)先為各個(gè)執(zhí)行線程中的每一個(gè),添加標(biāo)簽。由該標(biāo)簽?zāi)艽_定/確認(rèn)/識(shí)別標(biāo)簽所對(duì)應(yīng)的執(zhí)行線程。這樣,預(yù)先把各種取模結(jié)果與各個(gè)標(biāo)簽進(jìn)行關(guān)聯(lián),就可以找到對(duì)應(yīng)的執(zhí)行線程。
[0051]例如,將心跳包中的IP地址“192.168.0.1”轉(zhuǎn)化為長(zhǎng)整型數(shù)字“3232235521”,若系統(tǒng)中存在6個(gè)執(zhí)行線程,并且執(zhí)行線程I一執(zhí)行線程6的標(biāo)簽順次為1-6,預(yù)先將這6個(gè)標(biāo)簽與可能出現(xiàn)的取模結(jié)果一一對(duì)應(yīng),如,若取模結(jié)果為1,則關(guān)聯(lián)執(zhí)行線程1,若取模結(jié)果為2,則關(guān)聯(lián)執(zhí)行線程2,將“3232235521”對(duì)執(zhí)行線程的數(shù)量6取模,取模結(jié)果為1,則獨(dú)立線程將該心跳包發(fā)送給執(zhí)行線程1,以執(zhí)行心跳包處理。
[0052]這樣,通過取模的方式把每一個(gè)心跳包發(fā)送到其對(duì)應(yīng)的執(zhí)行線程中,可以達(dá)到自動(dòng)負(fù)載均衡的效果,而當(dāng)大量設(shè)備向心跳服務(wù)器發(fā)送大量的心跳包時(shí),還可以使每一個(gè)執(zhí)行線程接收的心跳包數(shù)據(jù)大致均衡,避免了單獨(dú)一個(gè)執(zhí)行線程處理的心跳包數(shù)量遠(yuǎn)大于其他執(zhí)行線程的心跳包處理數(shù)量,造成的系統(tǒng)壓力。
[0053]在另一個(gè)實(shí)施例中,可以根據(jù)每一個(gè)心跳包中的設(shè)備名稱,將心跳包發(fā)送至對(duì)應(yīng)的執(zhí)行線程中。這里,可以預(yù)先對(duì)多個(gè)設(shè)備進(jìn)行預(yù)分配,將每一個(gè)設(shè)備對(duì)應(yīng)一個(gè)執(zhí)行線程。例如,集群中存在100個(gè)設(shè)備,并且系統(tǒng)具有2個(gè)執(zhí)行線程,則可以將設(shè)備I一設(shè)備50對(duì)應(yīng)執(zhí)行線程I,將設(shè)備51—設(shè)備100對(duì)應(yīng)執(zhí)行線程2,對(duì)于設(shè)備上報(bào)的心跳包,由獨(dú)立線程發(fā)送到與上報(bào)該心跳包的設(shè)備對(duì)應(yīng)的執(zhí)行線程中處理,如,設(shè)備2上報(bào)一個(gè)心跳包,則獨(dú)立線程將該心跳包發(fā)送給執(zhí)行線程I處理。
[0054]從而,利用獨(dú)立線程將心跳包發(fā)送至相應(yīng)的執(zhí)行線程中,這樣,可以保證該多個(gè)執(zhí)行線程可以并發(fā)執(zhí)行心跳包的處理,進(jìn)而可以達(dá)到負(fù)載(心跳包)均衡效果。
[0055]步驟S106,一個(gè)或多個(gè)執(zhí)行線程根據(jù)各自對(duì)應(yīng)的散列表和心跳包隊(duì)列并行的對(duì)對(duì)應(yīng)心跳包執(zhí)行心跳包處理。
[0056]一個(gè)實(shí)施方式,一個(gè)或多個(gè)執(zhí)行線程中的每一個(gè)執(zhí)行線程擁有對(duì)應(yīng)的散列表和心跳包隊(duì)列,例如,執(zhí)行線程I對(duì)應(yīng)散列表I和心跳包隊(duì)列1,執(zhí)行線程2對(duì)應(yīng)散列表2和心跳包隊(duì)列2 ;執(zhí)行線程可以通過查詢散列表和心跳包隊(duì)列更新上報(bào)該心跳包的設(shè)備的當(dāng)前設(shè)備狀態(tài)。
[0057]所述散列表記錄對(duì)應(yīng)的執(zhí)行線程接收的每一個(gè)心跳包的相關(guān)信息,該相關(guān)信息是該心跳包對(duì)應(yīng)的設(shè)備的設(shè)備信息,例如,以設(shè)備名稱作為關(guān)鍵詞,所述設(shè)備信息可以包括心跳包的最近一次上報(bào)時(shí)間,上報(bào)該心跳包的設(shè)備的設(shè)備名稱和當(dāng)前設(shè)備狀態(tài),如圖2所示的心跳包處理的散列表的示意圖,在所述散列表中保存有多個(gè)設(shè)備的設(shè)備名稱,每一個(gè)設(shè)備最近一次上報(bào)心跳包的上報(bào)時(shí)間,每一個(gè)設(shè)備的當(dāng)前設(shè)備狀態(tài)(線上或線下)。
[0058]所述心跳包隊(duì)列順序存儲(chǔ)對(duì)應(yīng)的執(zhí)行線程接收的每一個(gè)心跳包的心跳包信息,如圖3所述的心跳包處理的心跳包隊(duì)列的示意圖,按照從心跳包隊(duì)列的首部到心跳包隊(duì)列的尾部的存儲(chǔ)位置順序,存儲(chǔ)收到的心跳包,例如,收到的第一個(gè)心跳包存儲(chǔ)到該心跳包隊(duì)列的首部,收到的第二個(gè)心跳包存儲(chǔ)到第一個(gè)心跳包之后,其中,所述心跳包信息可以包括:上報(bào)該心跳包的設(shè)備名稱(心跳包對(duì)應(yīng)的設(shè)備的設(shè)備名稱)和該心跳包的上報(bào)時(shí)間。
[0059]在本申請(qǐng)實(shí)施例中,每個(gè)執(zhí)行線程有自己的散列表和心跳包隊(duì)列。具體而言,一種情況,每一個(gè)執(zhí)行線程可以單獨(dú)具有對(duì)應(yīng)的散列表和心跳包隊(duì)列,其中,所述執(zhí)行線程可以單獨(dú)存儲(chǔ)對(duì)應(yīng)的散列表和心跳包隊(duì)列,以及將該每一個(gè)唯一的標(biāo)簽對(duì)應(yīng)多個(gè)執(zhí)行線程中的一個(gè)執(zhí)行線程,以此來界定每一個(gè)執(zhí)行線程各自對(duì)應(yīng)的散列表和心跳包隊(duì)列。
[0060]由于在現(xiàn)有技術(shù)中,多個(gè)線程不能同時(shí)對(duì)同一棵樹操作,所以多個(gè)線程之間不能并行的處理心跳包,而且,每一個(gè)執(zhí)行線程不能獨(dú)立的完成一個(gè)心跳包的處理全過程,造成心跳包處理效率較低。然而,本申請(qǐng)所述的方法,系統(tǒng)采用多核CPU,并且每一個(gè)執(zhí)行線程各自存儲(chǔ)與心跳包有關(guān)的彳目息(散列表和心跳包隊(duì)列),從而,基于各自存儲(chǔ)的與心跳包有關(guān)的信息,并且每一個(gè)執(zhí)行線程可以獨(dú)立的完成一個(gè)心跳包的處理全過程,所以,多個(gè)執(zhí)行線程可以并行的處理各自接收到的心跳包。
[0061]該心跳包的處理可以包括:根據(jù)心跳包對(duì)應(yīng)的設(shè)備的心跳包上報(bào)情況,將上報(bào)該心跳包的設(shè)備的狀態(tài)變更為上線或?qū)⑸蠄?bào)該心跳包的設(shè)備的狀態(tài)變更為線下等。
[0062]每一個(gè)執(zhí)行線程可以各自存儲(chǔ)的與心跳包有關(guān)的信息,如,散列表和心跳包隊(duì)列,并且多個(gè)執(zhí)行線程之間的散列表和心跳包隊(duì)列互不影響,多個(gè)執(zhí)行線程并行的對(duì)對(duì)應(yīng)的散列表和心跳包隊(duì)列執(zhí)行操作,從而減小了每一個(gè)執(zhí)行線程的運(yùn)算量。
[0063]然而,在現(xiàn)有技術(shù)中,系統(tǒng)將接收到的所有心跳包是全部存放在一個(gè)樹結(jié)構(gòu)中,如:二叉查找樹,在進(jìn)行心跳包處理時(shí),可以對(duì)所述二叉查找樹進(jìn)行遍歷,但是隨著集群的不斷擴(kuò)大,該二叉查找樹中的節(jié)點(diǎn)也不斷增加,若實(shí)現(xiàn)對(duì)該二叉查找樹的各個(gè)節(jié)點(diǎn)的遍歷,所付出的運(yùn)算量巨大。而本申請(qǐng)中所述散列表不需要進(jìn)行遍歷,只需查詢散列表中的設(shè)備信息即可,而且,在系統(tǒng)性能允許的前提下,可以無限擴(kuò)展存儲(chǔ)空間。從而提高了心跳包的處理效率。
[0064]具體而言,所述執(zhí)行線程對(duì)對(duì)應(yīng)心跳包執(zhí)行心跳包處理,目的在于監(jiān)控到與該心跳包對(duì)應(yīng)的設(shè)備的當(dāng)前設(shè)備狀態(tài),即,及時(shí)的對(duì)散列表中的設(shè)備信息進(jìn)行更新,如圖4所示,圖4是本申請(qǐng)實(shí)施例的更新散列表的步驟的流程圖。
[0065]在步驟S402處,當(dāng)所述執(zhí)行線程接收到心跳包時(shí),查詢所述散列表中與該心跳包對(duì)應(yīng)的設(shè)備名稱的當(dāng)前設(shè)備狀態(tài),并根據(jù)所述心跳包更新所述散列表。
[0066]具體而言,當(dāng)執(zhí)行線程接收到心跳包時(shí),若與所述心跳包對(duì)應(yīng)的設(shè)備的當(dāng)前設(shè)備狀態(tài)是線下,則將該設(shè)備的當(dāng)前設(shè)備狀態(tài)置為線上并根據(jù)所述心跳包的上報(bào)時(shí)間更新該設(shè)備的最近一次上報(bào)時(shí)間;若與所述心跳包對(duì)應(yīng)的該設(shè)備的當(dāng)前設(shè)備狀態(tài)是線上,則根據(jù)該心跳包的上報(bào)時(shí)間更新該設(shè)備的最近一次上報(bào)時(shí)間;若在散列表中不包含與該心跳包對(duì)應(yīng)的設(shè)備的設(shè)備信息,則根據(jù)該心跳包中包含的設(shè)備名稱、上報(bào)時(shí)間等,在散列表中新建與該心跳包對(duì)應(yīng)的設(shè)備的設(shè)備信息,并將所述設(shè)備的當(dāng)前設(shè)備狀態(tài)置于線上。
[0067]在一個(gè)實(shí)施例中,在查詢所述散列表之前,可以將所述心跳包中包含的上報(bào)時(shí)間與系統(tǒng)啟動(dòng)時(shí)間和彈性時(shí)間的和做比較,所述彈性時(shí)間=心跳包上報(bào)的頻率X允許丟包的個(gè)數(shù)+心跳包最大延遲時(shí)間(IntervalTime XDrop+DelayTime),表示允許丟包的時(shí)間間隔和允許心跳包發(fā)生通信延遲的最大延遲時(shí)間的和,該彈性時(shí)間可以用來衡量系統(tǒng)啟動(dòng)后的預(yù)熱時(shí)間,也可以衡量接收心跳包能夠容許的最大延后時(shí)間,即在該彈性時(shí)間內(nèi)接收到的心跳包是處在一個(gè)彈性時(shí)間內(nèi),允許將該心跳包對(duì)應(yīng)的設(shè)備狀態(tài)置為線上或保持線上狀態(tài)。若在彈性時(shí)間內(nèi)未收到設(shè)備上報(bào)心跳包,則可以認(rèn)為該設(shè)備已經(jīng)下線(線下設(shè)備)。
[0068]在根據(jù)所述心跳包更新散列表時(shí),執(zhí)行線程還可以將該心跳包對(duì)應(yīng)的設(shè)備的當(dāng)前設(shè)備狀態(tài)的變化情況通知對(duì)該設(shè)備感興趣的設(shè)備和/或服務(wù)器,例如,災(zāi)難備份服務(wù)器、業(yè)務(wù)控制服務(wù)器等,例如,當(dāng)用戶在線網(wǎng)游時(shí),入口服務(wù)器需要了解所管理控制的所有內(nèi)容服務(wù)器設(shè)備的當(dāng)前運(yùn)行情況,如,線上或線下,所以,當(dāng)一個(gè)內(nèi)容服務(wù)器設(shè)備的狀態(tài)發(fā)生變化時(shí),心跳包服務(wù)器可以通知該入口服務(wù)器所述內(nèi)容服務(wù)器設(shè)備所發(fā)生的變化。
[0069]當(dāng)執(zhí)行線程接收到心跳包時(shí),查詢?cè)搱?zhí)行線程對(duì)應(yīng)的散列表,若所述心跳包的上報(bào)時(shí)間小于所述系統(tǒng)啟動(dòng)時(shí)間和彈性時(shí)間的和(上報(bào)時(shí)間〈系統(tǒng)啟動(dòng)時(shí)間+彈性時(shí)間),則改變散列表中對(duì)應(yīng)的設(shè)備信息的最近一次上報(bào)時(shí)間,但不向?qū)υ撛O(shè)備感興趣的設(shè)備和/或服務(wù)器發(fā)送通知,具體而言,在進(jìn)行心跳包處理時(shí),可以發(fā)生第一心跳服務(wù)器由于某種原因而停止工作進(jìn)而將心跳服務(wù)切換到第二心跳服務(wù)器上執(zhí)行,由于集群中的大量設(shè)備還處于線上狀態(tài),所以為了不誤導(dǎo)對(duì)所述設(shè)備感興趣的設(shè)備和/或服務(wù)器,在第二心跳服務(wù)器系統(tǒng)啟動(dòng)初期的預(yù)熱時(shí)間(彈性時(shí)間)內(nèi),可以不向所述對(duì)設(shè)備感興趣的設(shè)備和/或服務(wù)器發(fā)送通知,即,原來設(shè)備當(dāng)前狀態(tài)為線上,由于發(fā)生了心跳服務(wù)器的切換,在第二心跳服務(wù)器第一次接收到來自設(shè)備的心跳包時(shí),可能再次向?qū)υ撛O(shè)備感興趣的設(shè)備和/或服務(wù)器發(fā)送通知(表示該設(shè)備已經(jīng)上線),為了避免再次發(fā)送設(shè)備狀態(tài)變化的通知,第二心跳服務(wù)器啟動(dòng)初期可以只處理心跳包而不發(fā)送通知。
[0070]當(dāng)所述心跳包的上報(bào)時(shí)間大于所述系統(tǒng)啟動(dòng)時(shí)間和彈性時(shí)間的和(上報(bào)時(shí)間 > 系統(tǒng)啟動(dòng)時(shí)間+彈性時(shí)間),并且所述心跳包對(duì)應(yīng)的設(shè)備狀態(tài)為線下時(shí),則將該心跳包對(duì)應(yīng)的設(shè)備狀態(tài)置為線上,以及將該設(shè)備的狀態(tài)變化的通知發(fā)送給對(duì)該設(shè)備感興趣的設(shè)備和/或服務(wù)器。
[0071]由于在集群中存在大量的設(shè)備,若其中一設(shè)備在一段時(shí)間內(nèi)未向心跳服務(wù)器發(fā)送心跳包,則表示該設(shè)備已經(jīng)下線(線下設(shè)備),但是在散列表中的設(shè)備狀態(tài)依舊保持在線上狀態(tài),在這種情況下,需要對(duì)心跳包隊(duì)列中保存的心跳包(設(shè)備的心跳包時(shí)間)進(jìn)行分析,以確定哪些設(shè)備已經(jīng)下線,并及時(shí)改變?cè)撛O(shè)備在散列表中的當(dāng)前設(shè)備狀態(tài),將當(dāng)前設(shè)備狀態(tài)由線上置為線下,以及將該設(shè)備的狀態(tài)變化的通知發(fā)送給對(duì)該設(shè)備感興趣的設(shè)備和/或服務(wù)器,以增加系統(tǒng)對(duì)設(shè)備狀態(tài)的靈敏度。
[0072]進(jìn)一步地,所述執(zhí)行線程既負(fù)責(zé)將上報(bào)心跳包的設(shè)備的設(shè)備狀態(tài)置為線上,也負(fù)責(zé)將一定時(shí)間未上報(bào)心跳包的設(shè)備的設(shè)備狀態(tài)置為線下,即,本申請(qǐng)所述的執(zhí)行線程可以執(zhí)行心跳包的完整的處理過程。
[0073]在步驟S404處,對(duì)所述心跳包隊(duì)列進(jìn)行分析,并根據(jù)分析結(jié)果更新所述散列表中所述設(shè)備的設(shè)備當(dāng)前狀態(tài)。
[0074]為了達(dá)到系統(tǒng)運(yùn)行的最大效率,所述執(zhí)行線程可以對(duì)對(duì)應(yīng)的心跳包隊(duì)列進(jìn)行分析,以確定設(shè)備的當(dāng)前設(shè)備狀態(tài)(上線或下線)。可以預(yù)設(shè)一個(gè)執(zhí)行線程接收心跳包的接收閾值,當(dāng)執(zhí)行線程接收的心跳包數(shù)量達(dá)到該接收閾值時(shí),則對(duì)心跳包隊(duì)列中的心跳包進(jìn)行分析,確定與上報(bào)該心跳包的設(shè)備的當(dāng)前設(shè)備狀態(tài)是否發(fā)生了變化,并根據(jù)分析結(jié)果更新散列表中的設(shè)備當(dāng)前設(shè)備狀態(tài)。
[0075]在另一個(gè)實(shí)施例中,可以預(yù)設(shè)一個(gè)執(zhí)行線程接收心跳包的時(shí)間閾值,當(dāng)執(zhí)行線程接收心跳包的時(shí)間達(dá)到該時(shí)間閾值時(shí),則所述執(zhí)行線程暫停對(duì)接收的心跳包的處理,例如,更新散列表,在心跳包隊(duì)列中添加心跳包相關(guān)信息,進(jìn)而執(zhí)行心跳包隊(duì)列的分析。
[0076]在另一個(gè)實(shí)施例中,所述執(zhí)行線程處于空閑狀態(tài)時(shí),S卩,在數(shù)據(jù)緩沖區(qū)中的需要處理的心跳包數(shù)量小于一定值時(shí),所述執(zhí)行線程執(zhí)行心跳包隊(duì)列的分析;或者在系統(tǒng)的心跳包處理服務(wù)終止后,執(zhí)行隊(duì)列無需在接收心跳包,則可以執(zhí)行心跳包隊(duì)列的分析。
[0077]進(jìn)一步地,為了減輕系統(tǒng)負(fù)擔(dān),預(yù)設(shè)一個(gè)間歇時(shí)間,在執(zhí)行線程分析一定數(shù)量或一定時(shí)間的心跳包隊(duì)列中的心跳包后,所述執(zhí)行線程暫停對(duì)心跳包隊(duì)列的分析,并且在間歇時(shí)間內(nèi)不可以再對(duì)心跳包隊(duì)列中的心跳包進(jìn)行分析。
[0078]所述執(zhí)行線程對(duì)所述心跳包隊(duì)列進(jìn)行分析,以確定在一定時(shí)間內(nèi)未發(fā)送心跳包的設(shè)備,并根據(jù)分析結(jié)果更新所述散列表中所述設(shè)備的設(shè)備當(dāng)前狀態(tài),換言之,確定所述心跳包隊(duì)列中的心跳包對(duì)應(yīng)的設(shè)備是否下線,若設(shè)備已經(jīng)下線,則將散列表中的該設(shè)備的當(dāng)前設(shè)備狀態(tài)變更為線下,若設(shè)備依舊為線上,則不變更散列表中的該設(shè)備的當(dāng)前設(shè)備狀態(tài)。
[0079]具體而言,所述執(zhí)行線程在分析所述心跳包隊(duì)列,即判斷心跳包對(duì)應(yīng)的設(shè)備是否需要下線,如圖5所示為本申請(qǐng)實(shí)施例的對(duì)心跳包隊(duì)列的分析的步驟的流程圖。
[0080]在步驟S502處,可以在所述心跳包隊(duì)列中,順次查詢所述心跳包的上報(bào)時(shí)間。
[0081]具體而言,首先從所述心跳包隊(duì)列中查詢一個(gè)上報(bào)時(shí)間最早的心跳包(所述心跳包隊(duì)列中最早存儲(chǔ)的心跳包,如,隊(duì)首),執(zhí)行對(duì)該心跳包的分析,分析結(jié)束再從該心跳包隊(duì)列中順次查詢下一個(gè)心跳包的上報(bào)時(shí)間。
[0082]根據(jù)所述心跳包的上報(bào)時(shí)間,確定與所述心跳包對(duì)應(yīng)的設(shè)備的當(dāng)前設(shè)備狀態(tài)。
[0083]具體而言,可以在步驟S504處,根據(jù)所述心跳包的上報(bào)時(shí)間,確定當(dāng)前時(shí)間與該心跳包的上報(bào)時(shí)間的差和彈性時(shí)間的關(guān)系。
[0084]若當(dāng)前時(shí)間與該心跳包的上報(bào)時(shí)間的差小于彈性時(shí)間(Cur r en t T i me -He ar t T i me〈IntervalTimeXDrop+DelayTime),則表示所述執(zhí)行線程接收該心跳包的時(shí)間處于彈性時(shí)間內(nèi),可以允許該心跳包對(duì)應(yīng)的設(shè)備的當(dāng)前設(shè)備狀態(tài)保持在線上狀態(tài),則所述心跳包對(duì)應(yīng)的設(shè)備為線上,那么暫時(shí)忽略對(duì)該心跳包進(jìn)行處理,不變更散列表中的該設(shè)備的當(dāng)前設(shè)備狀態(tài),接下來,所述執(zhí)行線程順次查詢下一個(gè)心跳包隊(duì)列中的心跳包的上報(bào)時(shí)間,繼續(xù)比較當(dāng)前時(shí)間與上報(bào)時(shí)間的差值與彈性時(shí)間的關(guān)系。
[0085]若當(dāng)前時(shí)間與該心跳包的上報(bào)時(shí)間的差大于彈性時(shí)間(CurrentTime - HeartTime>IntervalTime XDrop+DelayTime),則表示所述執(zhí)行線程接收到該心跳包的時(shí)間超出彈性時(shí)間,該心跳包對(duì)應(yīng)的設(shè)備可能已經(jīng)下線,需要對(duì)該心跳包進(jìn)一步分析,確定該心跳包對(duì)應(yīng)的設(shè)備是否已經(jīng)下線。
[0086]在步驟S506處,查詢?cè)撔奶鼘?duì)應(yīng)的設(shè)備在散列表中的設(shè)備信息,以根據(jù)所述心跳包的上報(bào)時(shí)間,確定所述心跳包的上報(bào)時(shí)間與散列表中該設(shè)備的最近一次上報(bào)時(shí)間的關(guān)系O
[0087]若心跳包的上報(bào)時(shí)間小于所述最近一次上報(bào)時(shí)間,則說明該設(shè)備還在向心跳服務(wù)器發(fā)送心跳包,繼續(xù)判斷該設(shè)備是否還在向服務(wù)器發(fā)送心跳包,忽略對(duì)該心跳包的處理,不更新該散列表,保持與所述心跳包對(duì)應(yīng)的設(shè)備的當(dāng)前設(shè)備狀態(tài)為線上。
[0088]若心跳包的上報(bào)時(shí)間等于所述最近一次上報(bào)時(shí)間,則說明在一段時(shí)間內(nèi)所述設(shè)備沒有向心跳服務(wù)器發(fā)送過心跳包,該設(shè)備已經(jīng)下線,將散列表中的該設(shè)備的當(dāng)前設(shè)備狀態(tài)置于線下。
[0089]利用步驟S502-S506所述的方法,無需對(duì)散列表中記錄的每一個(gè)設(shè)備相關(guān)的信息進(jìn)行查詢、更新的操作,只對(duì)可能已經(jīng)下線的設(shè)備進(jìn)行判斷,可以有效的減少對(duì)大量心跳包的處理,提聞了系統(tǒng)運(yùn)行的速度,提聞了心跳包處理的效率。
[0090]本申請(qǐng)通過多個(gè)執(zhí)行線程并行的處理系統(tǒng)接收的大量的心跳包,避免了多個(gè)線程之間切換帶來的系統(tǒng)消耗,提高了系統(tǒng)對(duì)心跳包處理的效率;并且利用散列表和心跳包隊(duì)列避免了線程對(duì)樹的遍歷過程,利用對(duì)心跳包的上報(bào)時(shí)間和系統(tǒng)的當(dāng)前時(shí)間進(jìn)行比較的過程,減少了對(duì)每一個(gè)設(shè)備的當(dāng)前設(shè)備狀態(tài)的判斷過程,降低了系統(tǒng)的運(yùn)算量,提高了系統(tǒng)對(duì)心跳包處理的效率。
[0091 ] 本申請(qǐng)還提供了一種心跳包處理的裝置。
[0092]如圖6所示為本申請(qǐng)實(shí)施例的心跳包處理的裝置的示意圖。
[0093]在本申請(qǐng)所述的裝置中,包括一個(gè)或多個(gè)執(zhí)行模塊603-60N,以及獨(dú)立模塊601。
[0094]所述獨(dú)立線程601,用于依次獲取多個(gè)設(shè)備上報(bào)的多個(gè)心跳包;并將每一個(gè)所述心跳包發(fā)送至對(duì)應(yīng)的所述執(zhí)行模塊。
[0095]其中,所述心跳包至少包括以下信息:所述心跳包的上報(bào)時(shí)間、所述心跳包對(duì)應(yīng)的設(shè)備的IP地址。
[0096]所述獨(dú)立模塊601可以根據(jù)每一個(gè)所述心跳包中的IP地址,將所述各個(gè)心跳包發(fā)送至所述一個(gè)或多個(gè)執(zhí)行模塊中與其對(duì)應(yīng)的執(zhí)行模塊中。
[0097]進(jìn)一步地,所述獨(dú)立模塊601可以將所述心跳包中的IP地址轉(zhuǎn)化為長(zhǎng)整型數(shù)字,并將所述長(zhǎng)整型數(shù)字與執(zhí)行線程的數(shù)量取模,并得到取模結(jié)果;預(yù)先對(duì)各種取模結(jié)果進(jìn)行分析,并預(yù)先將每一種取模結(jié)果與所述多個(gè)執(zhí)行線程之一進(jìn)行關(guān)聯(lián);以及基于所述取模結(jié)果,所述獨(dú)立線程將所述心跳包發(fā)送至與該取模結(jié)果存在關(guān)聯(lián)關(guān)系的執(zhí)行線程中。
[0098]所述一個(gè)或多個(gè)所述執(zhí)行模塊603—執(zhí)行模塊60N根據(jù)各自對(duì)應(yīng)的散列表和心跳包隊(duì)列并行地對(duì)對(duì)應(yīng)的心跳包執(zhí)行處理。其中,每一個(gè)執(zhí)行模塊都包含散列表和心跳包隊(duì)列。
[0099]所述散列表記錄對(duì)應(yīng)的執(zhí)行線程接收的每一個(gè)心跳包對(duì)應(yīng)的設(shè)備的設(shè)備信息,其中,所述設(shè)備信息包括:所述心跳包的最近一次上報(bào)時(shí)間、所述心跳包對(duì)應(yīng)的設(shè)備的當(dāng)前設(shè)備狀態(tài);所述心跳包隊(duì)列順序存儲(chǔ)對(duì)應(yīng)的執(zhí)行線程接收的每一個(gè)心跳包的心跳包信息,其中,所述心跳包隊(duì)列的心跳包信息包括:所述心跳包的上報(bào)時(shí)間。
[0100]在進(jìn)行心跳包處理的時(shí),所述執(zhí)行模塊603—執(zhí)行模塊60N可以查詢所述散列表中與所述心跳包對(duì)應(yīng)的設(shè)備的當(dāng)前設(shè)備狀態(tài),并根據(jù)所述心跳包更新所述散列表。
[0101]具體而言,若與所述心跳包對(duì)應(yīng)的設(shè)備的當(dāng)前設(shè)備狀態(tài)是線下,則將所述設(shè)備的當(dāng)前設(shè)備狀態(tài)置為線上并根據(jù)所述心跳包的上報(bào)時(shí)間更新所述設(shè)備的最近一次上報(bào)時(shí)間;若與所述心跳包對(duì)應(yīng)的設(shè)備的當(dāng)前設(shè)備狀態(tài)是線上,則根據(jù)所述心跳包的上報(bào)時(shí)間更新所述設(shè)備的最近一次上報(bào)時(shí)間;以及若在散列表中不包含所述心跳包對(duì)應(yīng)的設(shè)備的設(shè)備信息,則根據(jù)所述心跳包,在散列表中新建與所述心跳包對(duì)應(yīng)的設(shè)備的設(shè)備信息,并將所述設(shè)備的當(dāng)前設(shè)備狀態(tài)置于線上。
[0102]所述執(zhí)行模塊603—執(zhí)行模塊60N還被配置成對(duì)所述心跳包隊(duì)列進(jìn)行分析,并根據(jù)分析結(jié)果更新所述散列表中所述設(shè)備的設(shè)備當(dāng)前狀態(tài)。
[0103]進(jìn)一步地,所述執(zhí)行模塊603—執(zhí)行模塊60N可以在所述心跳包隊(duì)列中,順次查詢所述心跳包的上報(bào)時(shí)間;根據(jù)所述心跳包的上報(bào)時(shí)間,確定與所述心跳包對(duì)應(yīng)的設(shè)備的當(dāng)前設(shè)備狀態(tài)。
[0104]具體而言,若當(dāng)前時(shí)間與該心跳包的上報(bào)時(shí)間的差小于彈性時(shí)間,則所述心跳包對(duì)應(yīng)的設(shè)備的當(dāng)前設(shè)備狀態(tài)為線上;若當(dāng)前時(shí)間與該心跳包的上報(bào)時(shí)間的差大于彈性時(shí)間,則查詢所述心跳包對(duì)應(yīng)的設(shè)備在散列表中的設(shè)備信息。若心跳包的上報(bào)時(shí)間小于所述最近一次上報(bào)時(shí)間,則保持與所述心跳包對(duì)應(yīng)的設(shè)備的當(dāng)前設(shè)備狀態(tài)為線上;若心跳包的上報(bào)時(shí)間等于所述最近一次上報(bào)時(shí)間,則將與所述心跳包對(duì)應(yīng)的設(shè)備的當(dāng)前設(shè)備狀態(tài)置于線下。
[0105]本申請(qǐng)利用獨(dú)立模塊獲取并分發(fā)心跳包,并使用多個(gè)執(zhí)行模塊并行的處理來自多個(gè)設(shè)備的心跳包,提高了心跳包的處理效率;
[0106]本申請(qǐng)?jiān)谧兏?dāng)前設(shè)備狀態(tài)時(shí),運(yùn)用散列表和心跳隊(duì)列,避免了對(duì)集群中每一個(gè)設(shè)備的遍歷,減少了系統(tǒng)的運(yùn)算量。
[0107]由于圖6所描述的本申請(qǐng)的裝置所包括的各個(gè)模塊的【具體實(shí)施方式】與圖1-圖5所示的【具體實(shí)施方式】是對(duì)應(yīng)的,由于已經(jīng)對(duì)圖1-圖5進(jìn)行了詳細(xì)描述,所以為了不模糊本申請(qǐng),在此不再對(duì)各個(gè)模塊的具體細(xì)節(jié)進(jìn)行描述。
[0108]本說明書中的各個(gè)實(shí)施例一般采用遞進(jìn)的方式描述,每個(gè)實(shí)施例重點(diǎn)說明的都是與其他實(shí)施例的不同之處,各個(gè)實(shí)施例之間相同相似的部分互相參見即可。
[0109]本申請(qǐng)可以在由計(jì)算機(jī)執(zhí)行的計(jì)算機(jī)可執(zhí)行指令的一般上下文中描述,例如程序模塊或單元。一般地,程序模塊或單元可以包括執(zhí)行特定任務(wù)或?qū)崿F(xiàn)特定抽象數(shù)據(jù)類型的例程、程序、對(duì)象、組件、數(shù)據(jù)結(jié)構(gòu)等等。一般來說,程序模塊或單元可以由軟件、硬件或兩者的結(jié)合來實(shí)現(xiàn)。也可以在分布式計(jì)算環(huán)境中實(shí)踐本申請(qǐng),在這些分布式計(jì)算環(huán)境中,由通過通信網(wǎng)絡(luò)而被連接的遠(yuǎn)程處理設(shè)備來執(zhí)行任務(wù)。在分布式計(jì)算環(huán)境中,程序模塊或單元可以位于包括存儲(chǔ)設(shè)備在內(nèi)的本地和遠(yuǎn)程計(jì)算機(jī)存儲(chǔ)介質(zhì)中。
[0110]最后,還需要說明的是,術(shù)語“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法、商品或者設(shè)備不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、商品或者設(shè)備所固有的要素。在沒有更多限制的情況下,由語句“包括一個(gè)......”限定的要素,并不排除在包括所述要素的過程、方法、商品或者設(shè)備中還存在另外的相同要素。
[0111]本領(lǐng)域內(nèi)的技術(shù)人員應(yīng)明白,本申請(qǐng)的實(shí)施例可提供為方法、系統(tǒng)、或計(jì)算機(jī)程序產(chǎn)品。因此,本申請(qǐng)可采用完全硬件實(shí)施例、完全軟件實(shí)施例、或結(jié)合軟件和硬件方面的實(shí)施例的形式。而且,本申請(qǐng)可采用在一個(gè)或多個(gè)其中包含有計(jì)算機(jī)可用程序代碼的計(jì)算機(jī)可用存儲(chǔ)介質(zhì)(包括但不限于磁盤存儲(chǔ)器、CD-ROM、光學(xué)存儲(chǔ)器等)上實(shí)施的計(jì)算機(jī)程序產(chǎn)品的形式。
[0112]本文中應(yīng)用了具體個(gè)例對(duì)本申請(qǐng)的原理及實(shí)施方式進(jìn)行了闡述,以上實(shí)施例的說明只是用于幫助理解本申請(qǐng)的方法及其主要思想;同時(shí),對(duì)于本領(lǐng)域的一般技術(shù)人員,依據(jù)本申請(qǐng)的思想,在【具體實(shí)施方式】及應(yīng)用范圍上均會(huì)有改變之處,綜上所述,本說明書內(nèi)容不應(yīng)理解為對(duì)本申請(qǐng)的限制。
【權(quán)利要求】
1.一種心跳包處理的方法,其特征在于,包括: 一個(gè)或多個(gè)執(zhí)行線程、以及獨(dú)立線程; 所述獨(dú)立線程依次獲取多個(gè)設(shè)備上報(bào)的一個(gè)或多個(gè)心跳包并發(fā)送至對(duì)應(yīng)的所述執(zhí)行線程; 一個(gè)或多個(gè)所述執(zhí)行線程,根據(jù)各自對(duì)應(yīng)的散列表和心跳包隊(duì)列,并行地對(duì)對(duì)應(yīng)的心跳包執(zhí)行處理。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于: 所述心跳包至少包括所述心跳包的上報(bào)時(shí)間、所述心跳包對(duì)應(yīng)的設(shè)備的IP地址; 所述散列表記錄對(duì)應(yīng)的執(zhí)行線程接收的每一個(gè)心跳包對(duì)應(yīng)的設(shè)備的設(shè)備信息;其中,所述設(shè)備信息包括:所述心跳包的最近一次上報(bào)時(shí)間、所述心跳包對(duì)應(yīng)的設(shè)備的當(dāng)前設(shè)備狀態(tài); 所述心跳包隊(duì)列順序存儲(chǔ)對(duì)應(yīng)的執(zhí)行線程接收的每一個(gè)心跳包的心跳包信息;其中, 所述心跳包隊(duì)列的心跳包信息包括:所述心跳包的上報(bào)時(shí)間。
3.根據(jù)權(quán)利要求2所述的方法,其特征在于,所述獨(dú)立線程依次獲取多個(gè)設(shè)備上報(bào)的多個(gè)心跳包的步驟,包括: 所述獨(dú)立線程根據(jù)每一個(gè)所述心跳包中的IP地址,將所述各個(gè)心跳包發(fā)送至與其對(duì)應(yīng)的執(zhí)行線程中。
4.根據(jù)權(quán)利要求3所述的方法,其特征在于: 將所述心跳包中的IP地址轉(zhuǎn)化為長(zhǎng)整型數(shù)字,并將所述長(zhǎng)整型數(shù)字與執(zhí)行線程的數(shù)量取模,并得到取模結(jié)果;以及 基于所述取模結(jié)果,所述獨(dú)立線程將所述心跳包發(fā)送至與該取模結(jié)果存在關(guān)聯(lián)關(guān)系的執(zhí)行線程中。
5.根據(jù)權(quán)利要求1或2所述的方法,其特征在于,所述一個(gè)或多個(gè)所述執(zhí)行線程根據(jù)各自對(duì)應(yīng)的散列表和心跳包隊(duì)列并行地對(duì)對(duì)應(yīng)的心跳包執(zhí)行處理的步驟,包括: 查詢所述散列表中與所述心跳包對(duì)應(yīng)的設(shè)備的當(dāng)前設(shè)備狀態(tài),并根據(jù)所述心跳包更新所述散列表。
6.根據(jù)權(quán)利要求5所述的方法,其特征在于,所述根據(jù)所述心跳包更新所述散列表的步驟,包括: 若與所述心跳包對(duì)應(yīng)的設(shè)備的當(dāng)前設(shè)備狀態(tài)是線下,則將所述設(shè)備的當(dāng)前設(shè)備狀態(tài)置為線上并根據(jù)所述心跳包的上報(bào)時(shí)間更新所述設(shè)備的最近一次上報(bào)時(shí)間; 若與所述心跳包對(duì)應(yīng)的設(shè)備的當(dāng)前設(shè)備狀態(tài)是線上,則根據(jù)所述心跳包的上報(bào)時(shí)間更新所述設(shè)備的最近一次上報(bào)時(shí)間;以及 若在散列表中不包含所述心跳包對(duì)應(yīng)的設(shè)備的設(shè)備信息,則根據(jù)所述心跳包,在散列表中新建與所述心跳包對(duì)應(yīng)的設(shè)備的設(shè)備信息,并將所述設(shè)備的當(dāng)前設(shè)備狀態(tài)置于線上。
7.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述一個(gè)或多個(gè)所述執(zhí)行線程根據(jù)各自對(duì)應(yīng)的散列表和心跳包隊(duì)列并行地對(duì)對(duì)應(yīng)的心跳包執(zhí)行處理的步驟,包括: 對(duì)所述心跳包隊(duì)列進(jìn)行分析,并根據(jù)分析結(jié)果更新所述散列表中所述設(shè)備的設(shè)備當(dāng)前狀態(tài)。
8.根據(jù)權(quán)利要求7所述的方法,其特征在于,所述對(duì)所述心跳包隊(duì)列進(jìn)行分析的步驟,包括: 在所述心跳包隊(duì)列中,順次查詢所述心跳包的上報(bào)時(shí)間; 根據(jù)所述心跳包的上報(bào)時(shí)間,確定與所述心跳包對(duì)應(yīng)的設(shè)備的當(dāng)前設(shè)備狀態(tài)。
9.根據(jù)權(quán)利要求8所述的方法,其特征在于,所述根據(jù)所述心跳包的上報(bào)時(shí)間,確定與所述心跳包對(duì)應(yīng)的設(shè)備的當(dāng)前設(shè)備狀態(tài)的步驟,包括: 若當(dāng)前時(shí)間與該心跳包的上報(bào)時(shí)間的差小于彈性時(shí)間,則所述心跳包對(duì)應(yīng)的設(shè)備的當(dāng)前設(shè)備狀態(tài)為線上; 若當(dāng)前時(shí)間與該心跳包的上報(bào)時(shí)間的差大于彈性時(shí)間,則查詢所述心跳包對(duì)應(yīng)的設(shè)備在散列表中的設(shè)備信息; 若心跳包的上報(bào)時(shí)間小于所述最近一次上報(bào)時(shí)間,則保持與所述心跳包對(duì)應(yīng)的設(shè)備的當(dāng)前設(shè)備狀態(tài)為線上; 若心跳包的上報(bào)時(shí)間等于所述最近一次上報(bào)時(shí)間,則將與所述心跳包對(duì)應(yīng)的設(shè)備的當(dāng)前設(shè)備狀態(tài)置于線下。
10.一種心跳包處理的裝置,其特征在于,包括: 一個(gè)或多個(gè)執(zhí)行模塊,以及獨(dú)立模塊; 所述獨(dú)立模塊,用于依次獲取多個(gè)設(shè)備上報(bào)的多個(gè)心跳包;并將每一個(gè)所述心跳包發(fā)送至對(duì)應(yīng)的所述執(zhí)行模塊; 一個(gè)或多個(gè)所述執(zhí)行模塊根據(jù)各自對(duì)應(yīng)的散列表和心跳包隊(duì)列并行地對(duì)對(duì)應(yīng)的心跳包執(zhí)行處理。
11.根據(jù)權(quán)利要求10所述的裝置,其特征在于: 所述心跳包至少包括所述心跳包的上報(bào)時(shí)間、所述心跳包對(duì)應(yīng)的設(shè)備的IP地址;所述散列表記錄對(duì)應(yīng)的執(zhí)行線程接收的每一個(gè)心跳包對(duì)應(yīng)的設(shè)備的設(shè)備信息,其中,所述設(shè)備信息包括:所述心跳包的最近一次上報(bào)時(shí)間、所述心跳包對(duì)應(yīng)的設(shè)備的當(dāng)前設(shè)備狀態(tài); 所述心跳包隊(duì)列順序存儲(chǔ)對(duì)應(yīng)的執(zhí)行線程接收的每一個(gè)心跳包的心跳包信息,其中,所述心跳包隊(duì)列的心跳包信息包括:所述心跳包的上報(bào)時(shí)間。
12.根據(jù)權(quán)利要求11所述的裝置,其特征在于,所述獨(dú)立模塊還被配置成: 所述獨(dú)立模塊根據(jù)每一個(gè)所述心跳包中的IP地址,將所述各個(gè)心跳包發(fā)送至與其對(duì)應(yīng)的執(zhí)行模塊中。
13.根據(jù)權(quán)利要求10或11所述的裝置,其特征在于,所述執(zhí)行模塊還被配置成: 查詢所述散列表中與所述心跳包對(duì)應(yīng)的設(shè)備的當(dāng)前設(shè)備狀態(tài),并根據(jù)所述心跳包更新所述散列表。
14.根據(jù)權(quán)利要求10所述的裝置,其特征在于,所述執(zhí)行模塊還被配置成: 對(duì)所述心跳包隊(duì)列進(jìn)行分析,并根據(jù)分析結(jié)果更新所述散列表中所述設(shè)備的設(shè)備當(dāng)前狀態(tài)。
【文檔編號(hào)】G06F9/48GK104166589SQ201310185186
【公開日】2014年11月26日 申請(qǐng)日期:2013年5月17日 優(yōu)先權(quán)日:2013年5月17日
【發(fā)明者】陶輝 申請(qǐng)人:阿里巴巴集團(tuán)控股有限公司