本申請(qǐng)涉及數(shù)據(jù)處理領(lǐng)域,特別是涉及一種消息處理方法,以及一種消息處理裝置。
背景技術(shù):
目前,服務(wù)器集群針對(duì)大規(guī)模消息通常采用異步處理的方式。這種方式主要存在以下問(wèn)題:
一方面,由于集群中各虛擬機(jī)的處理能力有差異,以相同速度從messagebroker上拉取消息時(shí),很容易在處理能力低下的虛擬機(jī)上已經(jīng)開始出現(xiàn)緩慢堆積,但處理性能卓越的虛擬機(jī)又處于閑置狀態(tài),因此存在消息分配不合理,資源利用不充分的問(wèn)題。
另一方面,在異步消息的處理架構(gòu)中,經(jīng)常出現(xiàn)消息處理能力落后于消息產(chǎn)生能力的情況,從而會(huì)在存儲(chǔ)并分發(fā)消息的消息中間件messagebroker上出現(xiàn)消息堆積,甚至?xí)沟胢essagebroker為了保證其自身運(yùn)作正常,主動(dòng)進(jìn)行消息丟棄,導(dǎo)致消息漏掉未處理。
技術(shù)實(shí)現(xiàn)要素:
鑒于上述問(wèn)題,提出了本申請(qǐng)實(shí)施例以便提供一種克服上述問(wèn)題或者至少部分地解決上述問(wèn)題的消息處理方法和裝置。
為了解決上述問(wèn)題,本申請(qǐng)公開了一種消息處理方法,包括:
對(duì)虛擬機(jī)的未處理消息進(jìn)行監(jiān)控;
當(dāng)檢測(cè)到未處理消息超出所述虛擬機(jī)的負(fù)載上限時(shí),切斷消息拉取。
優(yōu)選地,在所述對(duì)虛擬機(jī)的未處理消息進(jìn)行監(jiān)控之前,所述方法還包括:
從分發(fā)消息的消息中間件拉取消息。
優(yōu)選地,在所述從分發(fā)消息的消息中間件拉取消息之前,所述方法還包括:
訂閱所述消息中間件的消息緩存主隊(duì)列;
所述從分發(fā)消息的消息中間件拉取消息包括:
在接收到所述消息緩存主隊(duì)列的消息通知后,從所述消息緩存主隊(duì)列中拉取消息。
優(yōu)選地,所述切斷消息拉取包括:
切斷對(duì)所述消息緩存主隊(duì)列的消息訂閱,以切斷消息拉取。
優(yōu)選地,所述方法還包括:
當(dāng)檢測(cè)到所述未處理消息低于所述虛擬機(jī)的負(fù)載下限時(shí),恢復(fù)消息拉取。
優(yōu)選地,所述恢復(fù)消息拉取包括:
恢復(fù)對(duì)所述消息緩存主隊(duì)列的消息訂閱,以恢復(fù)消息拉取。
優(yōu)選地,所述檢測(cè)到所述未處理消息超出所述虛擬機(jī)的負(fù)載上限包括:
檢測(cè)到所述未處理消息所占用緩存超出第一配置值;
所述檢測(cè)到所述未處理消息低于所述虛擬機(jī)的負(fù)載下限包括:
檢測(cè)到所述未處理消息所占用緩存低于第二配置值。
優(yōu)選地,在所述從分發(fā)消息的消息中間件拉取消息之后,所述方法還包括:
將拉取的多個(gè)消息存儲(chǔ)至預(yù)先構(gòu)建的消息緩存子隊(duì)列中。
優(yōu)選地,所述方法還包括:
采用多個(gè)異步線程進(jìn)行消息處理。
優(yōu)選地,在所述從分發(fā)消息的消息中間件拉取消息之后,所述方法還包括:
通知所述消息中間件刪除已拉取的未處理消息;
或,通知所述消息中間件對(duì)已拉取的未處理消息添加已處理標(biāo)識(shí)。
優(yōu)選地,所述方法還包括:
檢測(cè)所述虛擬機(jī)的各項(xiàng)資源參數(shù),并根據(jù)檢測(cè)結(jié)果對(duì)所述虛擬機(jī)設(shè)置第一配置值和第二配置值。
本申請(qǐng)還提供了一種消息處理裝置,包括:
消息監(jiān)控模塊,用于對(duì)虛擬機(jī)的未處理消息進(jìn)行監(jiān)控。
消息拉取控制模塊,用于當(dāng)檢測(cè)到未處理消息超出所述虛擬機(jī)的負(fù)載上限時(shí),切斷消息拉取。
優(yōu)選地,所述裝置還包括:
消息拉取模塊,用于在所述對(duì)虛擬機(jī)的未處理消息進(jìn)行監(jiān)控之前,從分發(fā)消息的消息中間件拉取消息;
優(yōu)選地,所述裝置還包括:
消息訂閱模塊,用于在所述從分發(fā)消息的消息中間件拉取消息之前,訂閱所述消息中間件的消息緩存主隊(duì)列;
所述消息拉取模塊,具體用于在接收到所述消息緩存主隊(duì)列的消息通知后,從所述消息緩存主隊(duì)列中拉取消息。
優(yōu)選地,所述消息拉取控制模塊包括:
訂閱切斷子模塊,用于切斷對(duì)所述消息緩存主隊(duì)列的消息訂閱,以切斷消息拉取。
優(yōu)選地,所述消息拉取控制模塊,還用于當(dāng)檢測(cè)到所述未處理消息低于所述虛擬機(jī)的負(fù)載下限時(shí),恢復(fù)消息拉取。
優(yōu)選地,所述消息拉取控制模塊還包括:
訂閱恢復(fù)子模塊,用于恢復(fù)對(duì)所述消息緩存主隊(duì)列的消息訂閱,以恢復(fù)消息拉取。
優(yōu)選地,所述消息拉取控制模塊,具體用于當(dāng)檢測(cè)到所述未處理消息所占用緩存超出第一配置值時(shí),切斷消息拉??;當(dāng)檢測(cè)到所述未處理消息所占用緩存低于第二配置值時(shí),恢復(fù)消息拉取。
優(yōu)選地,所述裝置還包括:
消息存儲(chǔ)模塊,用于在所述從分發(fā)消息的消息中間件拉取消息之后,將拉取的多個(gè)消息存儲(chǔ)至預(yù)先構(gòu)建的消息緩存子隊(duì)列中。
優(yōu)選地,所述裝置還包括:
消息處理模塊,用于采用多個(gè)異步線程進(jìn)行消息處理。
本申請(qǐng)實(shí)施例包括以下優(yōu)點(diǎn):
依據(jù)本申請(qǐng)實(shí)施例,實(shí)時(shí)統(tǒng)計(jì)虛擬機(jī)的未處理消息,若檢測(cè)到未處理消 息超出虛擬機(jī)的負(fù)載上限,則切換消息拉取,避免在虛擬機(jī)上出現(xiàn)消息堆積。相應(yīng)的,若檢測(cè)到未處理消息低于虛擬機(jī)的負(fù)載下限,則恢復(fù)消息拉取,以實(shí)現(xiàn)對(duì)虛擬機(jī)處理資源的充分利用。通過(guò)上述方案可以根據(jù)服務(wù)器集群中各虛擬機(jī)的實(shí)際負(fù)載能力進(jìn)行消息拉取,可以將消息更多的分配到負(fù)載能力較好的虛擬機(jī),在充分有效利用處理資源的同時(shí),可以提高消息的整體處理效率。
并且,本申請(qǐng)實(shí)施例中,還可以采用消息緩存子隊(duì)列緩存從消息中間件的消息緩存主隊(duì)列中拉取的消息,并在拉取消息之后,通知消息中間件刪除已拉取的消息,或是標(biāo)記為已處理,從而有效緩解了消息中間件的存儲(chǔ)壓力,避免消息中間件上出現(xiàn)消息堆積以及消息漏掉未處理的問(wèn)題。
附圖說(shuō)明
圖1是本申請(qǐng)的一種消息處理方法實(shí)施例1的步驟流程圖;
圖2是本申請(qǐng)的一種消息處理方法實(shí)施例2的步驟流程圖;
圖3是背景技術(shù)的異步消息處理架構(gòu)圖;
圖4是應(yīng)用本申請(qǐng)實(shí)施例的異步消息處理架構(gòu)圖;
圖5是本申請(qǐng)實(shí)施例中切斷消息訂閱的示意圖;
圖6是本申請(qǐng)實(shí)施例中恢復(fù)消息訂閱的示意圖;
圖7是本申請(qǐng)的一種消息處理裝置實(shí)施例的結(jié)構(gòu)框圖。
具體實(shí)施方式
為使本申請(qǐng)的上述目的、特征和優(yōu)點(diǎn)能夠更加明顯易懂,下面結(jié)合附圖和具體實(shí)施方式對(duì)本申請(qǐng)作進(jìn)一步詳細(xì)的說(shuō)明。
實(shí)施例1
參照?qǐng)D1,示出了本申請(qǐng)的一種消息處理方法實(shí)施例1的步驟流程圖,具體可以包括如下步驟:
步驟101,對(duì)虛擬機(jī)的未處理消息進(jìn)行監(jiān)控。
本申請(qǐng)實(shí)施例可以應(yīng)用于服務(wù)器集群中執(zhí)行異步消息處理的各個(gè)虛擬機(jī),服務(wù)器集群中部署有多個(gè)虛擬機(jī),用于對(duì)待處理的大規(guī)模消息進(jìn)行異步 處理。本申請(qǐng)實(shí)施例針對(duì)各個(gè)虛擬機(jī)的未處理消息進(jìn)行監(jiān)控,以用于進(jìn)一步的判斷。
步驟102,當(dāng)檢測(cè)到未處理消息超出所述虛擬機(jī)的負(fù)載上限時(shí),切斷消息拉取。
此處虛擬機(jī)的負(fù)載上限可以表征虛擬機(jī)的平均負(fù)載能力或是最大負(fù)載能力,可以是根據(jù)虛擬機(jī)當(dāng)前負(fù)載能力來(lái)配置,例如根據(jù)對(duì)虛擬機(jī)當(dāng)前各項(xiàng)資源參數(shù)的檢測(cè)結(jié)果配置該負(fù)載上限;也可以根據(jù)虛擬機(jī)的歷史正常負(fù)載能力來(lái)配置,具體可以通過(guò)消息對(duì)歷史負(fù)載數(shù)據(jù)統(tǒng)計(jì)得到該負(fù)載上限,例如取歷史負(fù)載數(shù)據(jù)的均值或是最大值;可以是根據(jù)經(jīng)驗(yàn)設(shè)定的期望值,還可以采用其他任意適用的方式配置。
負(fù)載上限可以有多種表示形式。例如,采用消息的個(gè)數(shù)表示,或是采用消息的資源占用量來(lái)表示,例如消息所占用的cpu資源、存儲(chǔ)資源(例如緩存資源)、帶寬資源等至少一種。還可以是其他任意適用的表示形式,本申請(qǐng)對(duì)此并不做限制。
采用消息個(gè)數(shù)表示時(shí),可以直接將未處理消息與負(fù)載上限進(jìn)行比較。
采用資源占用量表示時(shí),具體根據(jù)未處理消息進(jìn)行比較時(shí),可以計(jì)算未處理消息實(shí)際的資源占用量或是預(yù)估的資源占用量,并將計(jì)算結(jié)果與負(fù)載上限進(jìn)行比較,計(jì)算結(jié)果高于該負(fù)載上限,也即是未處理消息高于負(fù)載上限;或是根據(jù)負(fù)載上限計(jì)算相應(yīng)的消息個(gè)數(shù),將未處理消息的個(gè)數(shù)與計(jì)算的消息個(gè)數(shù)進(jìn)行比較,未處理消息的個(gè)數(shù)高于計(jì)算的消息個(gè)數(shù),也即是未處理消息高于負(fù)載上限。
若檢測(cè)到未處理消息超出虛擬機(jī)的負(fù)載上限,則切斷消息拉取,以避免在虛擬機(jī)上出現(xiàn)消息堆積。切斷消息拉取可以有多種實(shí)現(xiàn)方式,例如切斷對(duì)消息中間件的訂閱,或是攔截或通過(guò)設(shè)置限制對(duì)消息拉取動(dòng)作等。
在本申請(qǐng)的優(yōu)選實(shí)施例中,還可以當(dāng)檢測(cè)到未處理消息低于所述虛擬機(jī)的負(fù)載下限時(shí),恢復(fù)消息拉取。
此處虛擬機(jī)的負(fù)載下限可以表征虛擬機(jī)的平均負(fù)載能力或是最小負(fù)載能力,需要保證其小于負(fù)載上限。具體可以是根據(jù)虛擬機(jī)當(dāng)前負(fù)載能力來(lái)配 置,例如根據(jù)對(duì)虛擬機(jī)當(dāng)前各項(xiàng)資源參數(shù)的檢測(cè)結(jié)果配置該負(fù)載下限;也可以根據(jù)虛擬機(jī)的歷史正常負(fù)載能力來(lái)配置,具體可以通過(guò)消息對(duì)歷史負(fù)載數(shù)據(jù)統(tǒng)計(jì)得到該負(fù)載下限,例如取歷史負(fù)載數(shù)據(jù)的均值或是最小值;可以是根據(jù)經(jīng)驗(yàn)設(shè)定的期望值,還可以采用其他任意適用的方式配置。
負(fù)載下限可以有多種表示形式,例如,采用消息的個(gè)數(shù)表示,或是采用消息的資源占用量來(lái)表示,例如消息所占用的cpu資源、存儲(chǔ)資源(例如緩存資源)、帶寬資源等至少一種。還可以是其他任意適用的表示形式,本申請(qǐng)對(duì)此并不做限制。
采用消息個(gè)數(shù)表示時(shí),可以直接將未處理消息與負(fù)載下限進(jìn)行比較。
采用資源占用量表示時(shí),具體根據(jù)未處理消息進(jìn)行比較時(shí),可以計(jì)算未處理消息實(shí)際的資源占用量或是預(yù)估的資源占用量,并將計(jì)算結(jié)果與負(fù)載下限進(jìn)行比較,計(jì)算結(jié)果低于該負(fù)載下限,也即是未處理消息低于負(fù)載下限;或是根據(jù)負(fù)載下限計(jì)算相應(yīng)的消息個(gè)數(shù),將未處理消息的個(gè)數(shù)與計(jì)算的消息個(gè)數(shù)進(jìn)行比較,未處理消息的個(gè)數(shù)低于計(jì)算的消息個(gè)數(shù),也即是未處理消息低于負(fù)載下限。
依據(jù)本申請(qǐng)實(shí)施例,若檢測(cè)到未處理消息低于所述虛擬機(jī)的負(fù)載下限,則恢復(fù)消息拉取,以實(shí)現(xiàn)對(duì)虛擬機(jī)處理資源的充分利用。
其中,恢復(fù)消息拉取可以有多種實(shí)現(xiàn)方式,例如恢復(fù)對(duì)消息中間件的訂閱,或是解除對(duì)消息拉取動(dòng)作的攔截或限制等。
通過(guò)上述方案可以根據(jù)服務(wù)器集群中各虛擬機(jī)的實(shí)際負(fù)載能力進(jìn)行消息拉取,可以將消息更多的分配到負(fù)載能力較好的虛擬機(jī),在充分有效利用處理資源的同時(shí),可以提高消息的整體處理效率。
本申請(qǐng)實(shí)施例中,優(yōu)選的,虛擬機(jī)處理的消息可以來(lái)源于消息中間件,該消息中間件用于向服務(wù)器集群中的各個(gè)虛擬機(jī)分發(fā)消息。具體可以從分發(fā)消息的消息中間件拉取消息。
待處理的消息在生成后即存儲(chǔ)至消息中間件,由消息中間件分發(fā)至各個(gè)虛擬機(jī)。其中,消息可以從對(duì)虛擬機(jī)上程序服務(wù)的訪問(wèn)請(qǐng)求中抽取,或是有其他的來(lái)源,本申請(qǐng)對(duì)此并不做限制。
本申請(qǐng)實(shí)施例中,各個(gè)虛擬機(jī)從消息中間件拉取消息,拉取的消息可以是消息中間件分配給該虛擬機(jī)處理的消息,具體的分配方式本申請(qǐng)并不做限制,例如,可以按照各個(gè)虛擬機(jī)的編號(hào)或是預(yù)先排定各個(gè)虛擬機(jī)的優(yōu)先級(jí),將待處理的任務(wù)按序分配給各個(gè)虛擬機(jī),或是按照預(yù)先設(shè)定的消息類型與虛擬機(jī)的對(duì)應(yīng)關(guān)系進(jìn)行分配,還可以按照預(yù)設(shè)的算法進(jìn)行分配;拉取的消息也可以是按照虛擬機(jī)拉取消息的請(qǐng)求,實(shí)行先到先得,將待處理的消息分配給先發(fā)送請(qǐng)求的虛擬機(jī)。
虛擬機(jī)拉取消息后便可以進(jìn)一步執(zhí)行對(duì)消息的處理,針對(duì)大規(guī)模消息處理的場(chǎng)景,拉取的消息較多,優(yōu)選處理的方式是采用異步線程池中多個(gè)異步線程進(jìn)行消息處理,相比于同步處理的方式可以大大提高消息處理的效率。
其中,消息中間件可以是messagebroker,也可以是其他任意適用的、實(shí)現(xiàn)消息分發(fā)功能的消息中間件,例如activemessenger。
實(shí)施例2
參照?qǐng)D2,示出了本申請(qǐng)的一種消息處理方法實(shí)施例2的步驟流程圖,應(yīng)用于服務(wù)器集群中執(zhí)行異步消息處理的各個(gè)虛擬機(jī),具體可以包括如下步驟:
步驟201,訂閱消息中間件的消息緩存主隊(duì)列。
消息中間件可以采用消息緩存主隊(duì)列保存待處理的所有消息,可以通過(guò)訂閱該消息緩存主隊(duì)列以獲知新消息。
訂閱是消息的一種傳遞機(jī)制,包括一個(gè)消息的發(fā)布者和多個(gè)訂閱者,應(yīng)用到本申請(qǐng)實(shí)施例,也即是消息發(fā)布者也即是消息中間件,消息訂閱者也即是各個(gè)虛擬機(jī)。優(yōu)選地,在訂閱消息時(shí),還可以訂閱具體優(yōu)選處理的消息類型,以使消息中間件在檢測(cè)到該類型的消息時(shí)通知對(duì)應(yīng)的虛擬機(jī)。
步驟202,在接收到所述消息緩存主隊(duì)列的消息通知后,從所述消息緩存主隊(duì)列中拉取消息,將拉取的多個(gè)消息存儲(chǔ)至預(yù)先構(gòu)建的消息緩存子隊(duì)列中。
訂閱所述消息中間件的消息緩存主隊(duì)列后,消息緩存隊(duì)列進(jìn)行新消息的 通知,在接收到所述消息緩存主隊(duì)列的消息通知后,再?gòu)乃鱿⒕彺嬷麝?duì)列中拉取消息。
本申請(qǐng)實(shí)施例中,采用分層緩存的方式,從消息中間件的消息緩存主隊(duì)列中拉取的消息緩存至虛擬機(jī)本地的消息緩存子隊(duì)列。
步驟203,通知所述消息中間件刪除已拉取的未處理消息;或,通知所述消息中間件對(duì)已拉取的未處理消息添加已處理標(biāo)識(shí)。
將消息緩存至虛擬機(jī)本地的消息緩存子隊(duì)列后,可以進(jìn)一步通知消息中間件刪除已拉取的消息,或是標(biāo)記為已處理,從而有效緩解了消息中間件的存儲(chǔ)壓力,避免消息中間件上出現(xiàn)消息堆積以及消息漏掉未處理的問(wèn)題。
在本申請(qǐng)的另一種優(yōu)選實(shí)施例中,本步驟也可以在由消息中間件主動(dòng)執(zhí)行,根據(jù)虛擬機(jī)拉取消息的請(qǐng)求將消息分配至虛擬機(jī)后,可以從消息緩存主隊(duì)中刪除已分配的消息,或是對(duì)已分配的消息添加已分配標(biāo)識(shí)。
步驟204,執(zhí)行消息處理。
步驟205,對(duì)所述虛擬機(jī)的未處理消息進(jìn)行監(jiān)控。
具體可以是對(duì)消息緩存子隊(duì)列中的未處理消息進(jìn)行監(jiān)控,具體可以是監(jiān)控未處理消息的個(gè)數(shù),也可以是監(jiān)控未處理消息的資源占用量,具體可以與負(fù)載上限或負(fù)載下限的表示方式可以一致,也可以不一致。進(jìn)行比較時(shí),可以換算為對(duì)應(yīng)消息的個(gè)數(shù)進(jìn)行比較,也可以換算為對(duì)應(yīng)的資源占用量進(jìn)行比較。
步驟206,當(dāng)檢測(cè)到所述消息緩存子隊(duì)列中所述未處理消息所占用緩存超出第一配置值時(shí),切斷對(duì)所述消息緩存主隊(duì)列的消息訂閱,以切斷消息拉取。
本實(shí)施例中,負(fù)載上限表示為消息占用的緩存大小,記為第一配置值,相應(yīng)的,所述檢測(cè)到未處理消息超出虛擬機(jī)的負(fù)載上限可以包括:檢測(cè)到所述消息緩存子隊(duì)列中所述未處理消息所占用緩存超出第一配置值。
本實(shí)施例中,切斷消息拉取通過(guò)切斷對(duì)消息緩存主隊(duì)列的訂閱實(shí)現(xiàn)。
步驟207,當(dāng)檢測(cè)到所述消息緩存子隊(duì)列中所述未處理消息所占用緩存低于第二配置值時(shí),恢復(fù)對(duì)所述消息緩存主隊(duì)列的消息訂閱,以恢復(fù)消息拉 取。
本實(shí)施例中,負(fù)載下限表示為消息占用的緩存大小,記為第二配置值,相應(yīng)的,所述檢測(cè)到未處理消息低于所述虛擬機(jī)的負(fù)載下限可以包括:檢測(cè)到所述消息緩存子隊(duì)列中所述未處理消息所占用緩存低于第二配置值。
本實(shí)施例中,恢復(fù)消息拉取通過(guò)恢復(fù)對(duì)消息緩存主隊(duì)列的訂閱實(shí)現(xiàn)。
進(jìn)一步優(yōu)選地,可以通過(guò)檢測(cè)所述虛擬機(jī)的各項(xiàng)資源參數(shù),例如cpu、存儲(chǔ)空間(例如緩存空間)、帶寬等至少一種。進(jìn)一步根據(jù)檢測(cè)結(jié)果對(duì)所述虛擬機(jī)設(shè)置第一配置值和第二配置值,具體的設(shè)置方式可以根據(jù)實(shí)際需求選擇,例如第一配置值設(shè)置為資源參數(shù)的80%,第二配置值設(shè)置為資源參數(shù)的30%。例如,檢測(cè)到虛擬機(jī)的緩存空間為100m,則對(duì)應(yīng)第一配置值設(shè)置為80m,第二配置值設(shè)置為30m。
依據(jù)本申請(qǐng)實(shí)施例,實(shí)時(shí)統(tǒng)計(jì)虛擬機(jī)的未處理消息,若檢測(cè)到未處理消息超出虛擬機(jī)的負(fù)載上限,則切換消息拉取,避免在虛擬機(jī)上出現(xiàn)消息堆積。相應(yīng)的,若檢測(cè)到未處理消息低于所述虛擬機(jī)的負(fù)載下限,則恢復(fù)消息拉取,以實(shí)現(xiàn)對(duì)虛擬機(jī)處理資源的充分利用。通過(guò)上述方案可以根據(jù)服務(wù)器集群中各虛擬機(jī)的實(shí)際負(fù)載能力進(jìn)行消息拉取,可以將消息更多的分配到負(fù)載能力較好的虛擬機(jī),在充分有效利用處理資源的同時(shí),可以提高消息的整體處理效率。
并且,本申請(qǐng)實(shí)施例中,還可以采用消息緩存子隊(duì)列緩存從消息中間件的消息緩存主隊(duì)列中拉取的消息,并在拉取消息之后,通知消息中間件刪除已拉取的消息,或是標(biāo)記為已處理,從而有效緩解了消息中間件的存儲(chǔ)壓力,避免消息中間件上出現(xiàn)消息堆積以及消息漏掉未處理的問(wèn)題。
為更好地說(shuō)明本申請(qǐng)實(shí)施例,以下對(duì)本申請(qǐng)與背景技術(shù)的方案進(jìn)行對(duì)比。如圖3示出了背景技術(shù)的異步消息處理架構(gòu)圖。通過(guò)messagebroker向多個(gè)虛擬機(jī)(vm_1~vm_n)分發(fā)消息,messagebroker采用集中緩存存儲(chǔ)未處理的所有消息。這種方案存在消息分配不合理、資源利用不充分、消息堆積以及可能的消息漏掉未處理的問(wèn)題。
如圖4示出了應(yīng)用本申請(qǐng)實(shí)施例的異步消息處理架構(gòu)圖。一方面,通過(guò) 分層緩存隊(duì)列的設(shè)計(jì),在消費(fèi)端構(gòu)建本地緩存隊(duì)列,messagebroker的集中緩存移至本地,從而有效緩解了消息中間件的存儲(chǔ)壓力,避免消息中間件上出現(xiàn)消息堆積以及消息漏掉未處理的問(wèn)題。
圖5示出了本申請(qǐng)實(shí)施例中切斷消息訂閱的示意圖,當(dāng)某個(gè)虛擬機(jī)上出現(xiàn)消息堆積,確定本地已緩存的消息總量,即緩存大小大于配置值1時(shí),則動(dòng)態(tài)切斷消息訂閱,避免在虛擬機(jī)上出現(xiàn)消息堆積。圖6示出了本申請(qǐng)實(shí)施例中恢復(fù)消息訂閱的示意圖,切斷訂閱后,不會(huì)從messagebroker拉取消息,但會(huì)持續(xù)處理本地緩存隊(duì)列的消息,當(dāng)某個(gè)虛擬機(jī)上本地已緩存的消息總量,即緩存大小小于預(yù)設(shè)的配置值2時(shí),則動(dòng)態(tài)恢復(fù)消息訂閱,見虛線所示,以實(shí)現(xiàn)對(duì)虛擬機(jī)處理資源的充分利用。由此可見,相比于背景技術(shù)的方案,本申請(qǐng)可以根據(jù)服務(wù)器集群中各虛擬機(jī)的實(shí)際負(fù)載能力進(jìn)行消息拉取,可以將消息更多的分配到負(fù)載能力較好的虛擬機(jī),在充分有效利用處理資源的同時(shí),可以提高消息的整體處理效率。
需要說(shuō)明的是,對(duì)于方法實(shí)施例,為了簡(jiǎn)單描述,故將其都表述為一系列的動(dòng)作組合,但是本領(lǐng)域技術(shù)人員應(yīng)該知悉,本申請(qǐng)實(shí)施例并不受所描述的動(dòng)作順序的限制,因?yàn)橐罁?jù)本申請(qǐng)實(shí)施例,某些步驟可以采用其他順序或者同時(shí)進(jìn)行。其次,本領(lǐng)域技術(shù)人員也應(yīng)該知悉,說(shuō)明書中所描述的實(shí)施例均屬于優(yōu)選實(shí)施例,所涉及的動(dòng)作并不一定是本申請(qǐng)實(shí)施例所必須的。
實(shí)施例3
參照?qǐng)D7,示出了本申請(qǐng)的一種消息處理裝置實(shí)施例的結(jié)構(gòu)框圖,部署于服務(wù)器集群中執(zhí)行異步消息處理的各個(gè)虛擬機(jī),具體可以包括如下模塊:
消息監(jiān)控模塊301,用于對(duì)虛擬機(jī)的未處理消息進(jìn)行監(jiān)控。
消息拉取控制模塊302,用于當(dāng)檢測(cè)到未處理消息超出所述虛擬機(jī)的負(fù)載上限時(shí),切斷消息拉取。
本申請(qǐng)實(shí)施例中,優(yōu)選地,所述裝置還包括:
消息拉取模塊,用于在所述對(duì)虛擬機(jī)的未處理消息進(jìn)行監(jiān)控之前,從分 發(fā)消息的消息中間件拉取消息;
本申請(qǐng)實(shí)施例中,優(yōu)選地,所述裝置還包括:
消息訂閱模塊,用于在所述從分發(fā)消息的消息中間件拉取消息之前,訂閱所述消息中間件的消息緩存主隊(duì)列;
所述消息拉取模塊,具體用于在接收到所述消息緩存主隊(duì)列的消息通知后,從所述消息緩存主隊(duì)列中拉取消息。
本申請(qǐng)實(shí)施例中,優(yōu)選地,所述消息拉取控制模塊包括:
訂閱切斷子模塊,用于切斷對(duì)所述消息緩存主隊(duì)列的消息訂閱,以切斷消息拉取。
本申請(qǐng)實(shí)施例中,優(yōu)選地,所述消息拉取控制模塊,還用于當(dāng)檢測(cè)到所述未處理消息低于所述虛擬機(jī)的負(fù)載下限時(shí),恢復(fù)消息拉取。
本申請(qǐng)實(shí)施例中,優(yōu)選地,所述消息拉取控制模塊還包括:
訂閱恢復(fù)子模塊,用于恢復(fù)對(duì)所述消息緩存主隊(duì)列的消息訂閱,以恢復(fù)消息拉取。
本申請(qǐng)實(shí)施例中,優(yōu)選地,所述消息拉取控制模塊,具體用于當(dāng)檢測(cè)到所述未處理消息所占用緩存超出第一配置值時(shí),切斷消息拉??;當(dāng)檢測(cè)到所述未處理消息所占用緩存低于第二配置值時(shí),恢復(fù)消息拉取。
本申請(qǐng)實(shí)施例中,優(yōu)選地,所述裝置還包括:
消息存儲(chǔ)模塊,用于在所述從分發(fā)消息的消息中間件拉取消息之后,將拉取的多個(gè)消息存儲(chǔ)至預(yù)先構(gòu)建的消息緩存子隊(duì)列中。
本申請(qǐng)實(shí)施例中,優(yōu)選地,所述裝置還包括:
消息處理模塊,用于采用多個(gè)異步線程進(jìn)行消息處理。
本申請(qǐng)實(shí)施例中,優(yōu)選地,所述裝置還包括:
通知模塊,用于在所述從消息中間件拉取消息之后,通知所述消息中間件刪除已拉取的未處理消息;或,通知所述消息中間件對(duì)已拉取的未處理消息添加已處理標(biāo)識(shí)。
本申請(qǐng)實(shí)施例中,優(yōu)選地,所述裝置還包括:
參數(shù)檢測(cè)模塊,用于檢測(cè)所述虛擬機(jī)的各項(xiàng)資源參數(shù),并根據(jù)檢測(cè)結(jié)果 對(duì)所述虛擬機(jī)設(shè)置第一配置值和第二配置值。
依據(jù)本申請(qǐng)實(shí)施例,實(shí)時(shí)統(tǒng)計(jì)虛擬機(jī)的未處理消息,若檢測(cè)到未處理消息超出虛擬機(jī)的負(fù)載上限,則切換消息拉取,避免在虛擬機(jī)上出現(xiàn)消息堆積。相應(yīng)的,若檢測(cè)到未處理消息低于所述虛擬機(jī)的負(fù)載下限,則恢復(fù)消息拉取,以實(shí)現(xiàn)對(duì)虛擬機(jī)處理資源的充分利用。通過(guò)上述方案可以根據(jù)服務(wù)器集群中各虛擬機(jī)的實(shí)際負(fù)載能力進(jìn)行消息拉取,可以將消息更多的分配到負(fù)載能力較好的虛擬機(jī),在充分有效利用處理資源的同時(shí),可以提高消息的整體處理效率。
并且,本申請(qǐng)實(shí)施例中,還可以采用消息緩存子隊(duì)列緩存從消息中間件的消息緩存主隊(duì)列中拉取的消息,并在拉取消息之后,通知消息中間件刪除已拉取的消息,或是標(biāo)記為已處理,從而有效緩解了消息中間件的存儲(chǔ)壓力,避免消息中間件上出現(xiàn)消息堆積以及消息漏掉未處理的問(wèn)題。
對(duì)于裝置實(shí)施例而言,由于其與方法實(shí)施例基本相似,所以描述的比較簡(jiǎn)單,相關(guān)之處參見方法實(shí)施例的部分說(shuō)明即可。
本說(shuō)明書中的各個(gè)實(shí)施例均采用遞進(jìn)的方式描述,每個(gè)實(shí)施例重點(diǎn)說(shuō)明的都是與其他實(shí)施例的不同之處,各個(gè)實(shí)施例之間相同相似的部分互相參見即可。
本領(lǐng)域內(nèi)的技術(shù)人員應(yīng)明白,本申請(qǐng)實(shí)施例的實(shí)施例可提供為方法、裝置、或計(jì)算機(jī)程序產(chǎn)品。因此,本申請(qǐng)實(shí)施例可采用完全硬件實(shí)施例、完全軟件實(shí)施例、或結(jié)合軟件和硬件方面的實(shí)施例的形式。而且,本申請(qǐng)實(shí)施例可采用在一個(gè)或多個(gè)其中包含有計(jì)算機(jī)可用程序代碼的計(jì)算機(jī)可用存儲(chǔ)介質(zhì)(包括但不限于磁盤存儲(chǔ)器、cd-rom、光學(xué)存儲(chǔ)器等)上實(shí)施的計(jì)算機(jī)程序產(chǎn)品的形式。
在一個(gè)典型的配置中,所述計(jì)算機(jī)設(shè)備包括一個(gè)或多個(gè)處理器(cpu)、輸入/輸出接口、網(wǎng)絡(luò)接口和內(nèi)存。內(nèi)存可能包括計(jì)算機(jī)可讀介質(zhì)中的非永久性存儲(chǔ)器,隨機(jī)存取存儲(chǔ)器(ram)和/或非易失性內(nèi)存等形式,如只讀存儲(chǔ)器(rom)或閃存(flashram)。內(nèi)存是計(jì)算機(jī)可讀介質(zhì)的示 例。計(jì)算機(jī)可讀介質(zhì)包括永久性和非永久性、可移動(dòng)和非可移動(dòng)媒體可以由任何方法或技術(shù)來(lái)實(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ǔ)器(eeprom)、快閃記憶體或其他內(nèi)存技術(shù)、只讀光盤只讀存儲(chǔ)器(cd-rom)、數(shù)字多功能光盤(dvd)或其他光學(xué)存儲(chǔ)、磁盒式磁帶,磁帶磁磁盤存儲(chǔ)或其他磁性存儲(chǔ)設(shè)備或任何其他非傳輸介質(zhì),可用于存儲(chǔ)可以被計(jì)算設(shè)備訪問(wèn)的信息。按照本文中的界定,計(jì)算機(jī)可讀介質(zhì)不包括非持續(xù)性的電腦可讀媒體(transitorymedia),如調(diào)制的數(shù)據(jù)信號(hào)和載波。
本申請(qǐng)實(shí)施例是參照根據(jù)本申請(qǐng)實(shí)施例的方法、終端設(shè)備(系統(tǒng))、和計(jì)算機(jī)程序產(chǎn)品的流程圖和/或方框圖來(lái)描述的。應(yīng)理解可由計(jì)算機(jī)程序指令實(shí)現(xiàn)流程圖和/或方框圖中的每一流程和/或方框、以及流程圖和/或方框圖中的流程和/或方框的結(jié)合。可提供這些計(jì)算機(jī)程序指令到通用計(jì)算機(jī)、專用計(jì)算機(jī)、嵌入式處理機(jī)或其他可編程數(shù)據(jù)處理終端設(shè)備的處理器以產(chǎn)生一個(gè)機(jī)器,使得通過(guò)計(jì)算機(jī)或其他可編程數(shù)據(jù)處理終端設(shè)備的處理器執(zhí)行的指令產(chǎn)生用于實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能的裝置。
這些計(jì)算機(jī)程序指令也可存儲(chǔ)在能引導(dǎo)計(jì)算機(jī)或其他可編程數(shù)據(jù)處理終端設(shè)備以特定方式工作的計(jì)算機(jī)可讀存儲(chǔ)器中,使得存儲(chǔ)在該計(jì)算機(jī)可讀存儲(chǔ)器中的指令產(chǎn)生包括指令裝置的制造品,該指令裝置實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能。
這些計(jì)算機(jī)程序指令也可裝載到計(jì)算機(jī)或其他可編程數(shù)據(jù)處理終端設(shè)備上,使得在計(jì)算機(jī)或其他可編程終端設(shè)備上執(zhí)行一系列操作步驟以產(chǎn)生計(jì)算機(jī)實(shí)現(xiàn)的處理,從而在計(jì)算機(jī)或其他可編程終端設(shè)備上執(zhí)行的指令提供用于實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能的步驟。
盡管已描述了本申請(qǐng)實(shí)施例的優(yōu)選實(shí)施例,但本領(lǐng)域內(nèi)的技術(shù)人員一旦得知了基本創(chuàng)造性概念,則可對(duì)這些實(shí)施例做出另外的變更和修改。所以,所附權(quán)利要求意欲解釋為包括優(yōu)選實(shí)施例以及落入本申請(qǐng)實(shí)施例范圍的所有變更和修改。
最后,還需要說(shuō)明的是,在本文中,諸如第一和第二等之類的關(guān)系術(shù)語(yǔ)僅僅用來(lái)將一個(gè)實(shí)體或者操作與另一個(gè)實(shí)體或操作區(qū)分開來(lái),而不一定要求或者暗示這些實(shí)體或操作之間存在任何這種實(shí)際的關(guān)系或者順序。而且,術(shù)語(yǔ)“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過(guò)程、方法、物品或者終端設(shè)備不僅包括那些要素,而且還包括沒(méi)有明確列出的其他要素,或者是還包括為這種過(guò)程、方法、物品或者終端設(shè)備所固有的要素。在沒(méi)有更多限制的情況下,由語(yǔ)句“包括一個(gè)……”限定的要素,并不排除在包括所述要素的過(guò)程、方法、物品或者終端設(shè)備中還存在另外的相同要素。
以上對(duì)本申請(qǐng)所提供的一種消息處理方法及裝置,進(jìn)行了詳細(xì)介紹,本文中應(yīng)用了具體個(gè)例對(duì)本申請(qǐng)的原理及實(shí)施方式進(jìn)行了闡述,以上實(shí)施例的說(shuō)明只是用于幫助理解本申請(qǐng)的方法及其核心思想;同時(shí),對(duì)于本領(lǐng)域的一般技術(shù)人員,依據(jù)本申請(qǐng)的思想,在具體實(shí)施方式及應(yīng)用范圍上均會(huì)有改變之處,綜上所述,本說(shuō)明書內(nèi)容不應(yīng)理解為對(duì)本申請(qǐng)的限制。