專利名稱:基于消息隊(duì)列的分布式方法和系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種基于消息中間件的分布式方法和系統(tǒng),更具體地,涉及一種基于消息隊(duì)列的分布式方法和系統(tǒng)。
背景技術(shù):
在大規(guī)模分布式系統(tǒng)中,消息中間件(message-oriented middleware, MOM)被廣泛使用。消息中間件是一種由消息傳輸機(jī)制或消息隊(duì)列模式組成的中間件技術(shù)。消息中間件利用高效可靠的消息傳輸機(jī)制進(jìn)行平臺(tái)無(wú)關(guān)的數(shù)據(jù)交流,并且基于數(shù)據(jù)通信來進(jìn)行分布式系統(tǒng)的集成。通常,消息中間件并不要求系統(tǒng)具備一個(gè)可靠的底部傳輸層,而是通過以消息的形式收發(fā)應(yīng)用程序數(shù)據(jù)來連接運(yùn)行于不同系統(tǒng)上的應(yīng)用程序。信息可以同步傳送,也支持異步傳送。在異步方式下,應(yīng)用程序并不需要消息即時(shí)即刻傳送到對(duì)方,只是由MOM確保把信息以消息的方式傳送到適當(dāng)?shù)哪康牡?,并且只傳一次。消息?duì)列(MQ) (Message Queuing)是一種應(yīng)用程序?qū)?yīng)用程序的通信方法。應(yīng)用程序通過寫和檢索出入隊(duì)列的針對(duì)應(yīng)用程序的數(shù)據(jù)(消息)來通信,而無(wú)需專用連接來鏈接它們。消息傳遞指的是程序之間通過在消息中發(fā)送數(shù)據(jù)進(jìn)行通信,而不是通過直接調(diào)用彼此來通信,直接調(diào)用通常是用于諸如遠(yuǎn)程過程調(diào)用的技術(shù)。排隊(duì)指的是應(yīng)用程序通過隊(duì)列來通信。隊(duì)列的使用除去了接收和發(fā)送應(yīng)用程序同時(shí)執(zhí)行的要求。MQ具有異步通信、消息路由可靠、安全性、協(xié)議無(wú)關(guān)性等優(yōu)點(diǎn)。然而,在大規(guī)模分布式系統(tǒng),如果使用通常的MQ解決方案,存在諸多缺點(diǎn),包括消費(fèi)消息阻塞;MQ單點(diǎn);發(fā)送消息阻塞;消息不匹配;MQ/消息無(wú)監(jiān)控;消息順序不一致;死信隊(duì)列無(wú)法處理。因此,需要一種用于增強(qiáng)MQ方案的基于消息隊(duì)列的分布式方法和系統(tǒng)。
發(fā)明內(nèi)容
根據(jù)本發(fā)明的一方面,提供了一種基于消息隊(duì)列的分布式方法,包括由第一應(yīng)用向隊(duì)列管理器發(fā)送消息;確定所述消息是否成功發(fā)送;如果確定沒有成功發(fā)送所述消息,則所述消息被放入第一異常處理模塊進(jìn)行處理;如果確定已經(jīng)成功發(fā)送所述消息,則由所述隊(duì)列管理器對(duì)所接收到的消息進(jìn)行處理;將所述消息發(fā)送到第二應(yīng)用;以及由所述第二應(yīng)用對(duì)所接收到的消息進(jìn)行處理。根據(jù)本發(fā)明的一個(gè)實(shí)施例,所述由所述隊(duì)列管理器對(duì)所接收到的消息進(jìn)行處理的步驟進(jìn)一步包括確定所述消息是否是死信;以及如果確定所述消息是死信,則所述消息被放入死信處理模塊以進(jìn)行處理。根據(jù)本發(fā)明的一個(gè)實(shí)施例,所述由第二應(yīng)用對(duì)所接收到的消息進(jìn)行處理的步驟進(jìn)一步包括確定所述第二應(yīng)用是否已經(jīng)成功處理了所述消息;以及如果確定沒有成功處理所述消息,則所述消息被放入第二異常處理模塊進(jìn)行處理。
根據(jù)本發(fā)明的一個(gè)實(shí)施例,所述消息被放入第一異常處理模塊進(jìn)行處理的步驟進(jìn)一步包括確定所述第一異常處理模塊是否已經(jīng)成功處理了所述消息;如果確定沒有成功處理所述消息,則向監(jiān)控模塊報(bào)告該情況;以及如果確定已經(jīng)成功處理了所述消息,則將所述消息發(fā)送到所述隊(duì)列管理器。根據(jù)本發(fā)明的一個(gè)實(shí)施例,所述消息被放入死信處理模塊以進(jìn)行處理的步驟進(jìn)一步包括確定所述死信處理模塊是否已經(jīng)成功處理所述消息;以及如果確定沒有成功處理所述消息,則向監(jiān)控模塊報(bào)告該情況。根據(jù)本發(fā)明的一個(gè)實(shí)施例,所述消息被放入第二異常處理模塊進(jìn)行處理的步驟進(jìn)一步包括確定所述第二異常處理模塊是否已經(jīng)成功處理了所述消息;以及如果確定沒有成功處理所述消息,則向監(jiān)控模塊報(bào)告該情況。根據(jù)本發(fā)明的一個(gè)實(shí)施例,在所述第一應(yīng)用向所述隊(duì)列管理器發(fā)送所述消息之前,注冊(cè)模塊可以對(duì)所述消息進(jìn)行匹配檢查,并且僅當(dāng)所述消息匹配時(shí),才繼續(xù)后續(xù)操作。根據(jù)本發(fā)明的一個(gè)實(shí)施例,所述隊(duì)列管理器是隊(duì)列管理器集群。根據(jù)本發(fā)明的一個(gè)實(shí)施例,所述由隊(duì)列管理器對(duì)所接收到的消息進(jìn)行處理進(jìn)一步包括確定所述隊(duì)列管理器集群中的一個(gè)隊(duì)列管理器未能正常工作;隔離所述一個(gè)隊(duì)列管理器,使得不會(huì)再有新的消息路由到所述一個(gè)隊(duì)列管理器;以及由其余的隊(duì)列管理器接管所述一個(gè)隊(duì)列管理器的工作。根據(jù)本發(fā)明的一個(gè)實(shí)施例,所述確定所述第一異常處理模塊是否已經(jīng)成功處理了所述消息的步驟在預(yù)定時(shí)間間隔之后執(zhí)行。根據(jù)本發(fā)明的一個(gè)實(shí)施例,所述確定所述死信處理模塊是否已經(jīng)成功處理所述消息的步驟在預(yù)定時(shí)間間隔之后執(zhí)行。根據(jù)本發(fā)明的一個(gè)實(shí)施例,所述確定所述第二異常處理模塊是否已經(jīng)成功處理了所述消息的步驟在預(yù)定時(shí)間間隔之后執(zhí)行。根據(jù)本發(fā)明的一方面,提供了一種基于消息隊(duì)列的分布式系統(tǒng),包括第一應(yīng)用,所述第一應(yīng)用被配置成向隊(duì)列管理器發(fā)送消息;第一異常處理模塊,所述第一異常處理模塊連接到所述第一應(yīng)用,并且被配置成對(duì)所述第一應(yīng)用沒有成功發(fā)送的消息進(jìn)行處理;隊(duì)列管理器,所述隊(duì)列管理器與所述第一應(yīng)用和所述第一異常處理模塊相連,并且被配置成對(duì)所接收到的消息進(jìn)行處理并且將所述消息發(fā)送到第二應(yīng)用;以及第二應(yīng)用,所述第二應(yīng)用連接到所述隊(duì)列管理器,并且被配置成對(duì)所接收到的消息進(jìn)行處理。根據(jù)本發(fā)明的一個(gè)實(shí)施例,所述系統(tǒng)進(jìn)一步包括監(jiān)控模塊,所述監(jiān)控模塊被配置成對(duì)所述第一應(yīng)用、所述隊(duì)列管理器和所述第二應(yīng)用進(jìn)行監(jiān)控。根據(jù)本發(fā)明的一個(gè)實(shí)施例,所述隊(duì)列管理器進(jìn)一步包括死信處理模塊,所述死信處理模塊被配置成對(duì)死信進(jìn)行處理。根據(jù)本發(fā)明的一個(gè)實(shí)施例,所述第二應(yīng)用進(jìn)一步包括第二異常處理模塊,所述第二異常處理模塊被配置成對(duì)所述第二應(yīng)用沒有成功處理的消息進(jìn)行處理。根據(jù)本發(fā)明的一個(gè)實(shí)施例,所述第一異常處理模塊進(jìn)一步被配置成確定是否已經(jīng)成功處理了所述消息;如果確定沒有成功處理所述消息,則向所述監(jiān)控模塊報(bào)告該情況;以及如果確定已經(jīng)成功處理了所述消息,則將所述消息發(fā)送到所述隊(duì)列管理器。根據(jù)本發(fā)明的一個(gè)實(shí)施例,所述死信處理模塊進(jìn)一步被配置成確定所述死信處理模塊是否已經(jīng)成功處理所述消息;以及如果確定沒有成功處理所述消息,則向所述監(jiān)控模塊報(bào)告該情況。根據(jù)本發(fā)明的一個(gè)實(shí)施例,所述第二異常處理模塊進(jìn)一步被配置成確定是否已經(jīng)成功處理了所述消息;以及如果確定沒有成功處理所述消息,則向所述監(jiān)控模塊報(bào)告該情況。根據(jù)本發(fā)明的一個(gè)實(shí)施例,所述系統(tǒng)進(jìn)一步包括注冊(cè)模塊,所述注冊(cè)模塊被配置成對(duì)所述消息進(jìn)行匹配檢查,并且僅當(dāng)所述消息匹配時(shí),才繼續(xù)后續(xù)操作。根據(jù)本發(fā)明的一個(gè)實(shí)施例,所述隊(duì)列管理器是隊(duì)列管理器集群。根據(jù)本發(fā)明的一個(gè)實(shí)施例,所述隊(duì)列管理器集群進(jìn)一步被配置成確定所述隊(duì)列管理器集群中的一個(gè)隊(duì)列管理器未能正常工作;隔離所述一個(gè)隊(duì)列管理器,使得不會(huì)再有新的消息路由到所述一個(gè)隊(duì)列管理器;以及由其余的隊(duì)列管理器接管所述一個(gè)隊(duì)列管理器的工作。根據(jù)本發(fā)明的一個(gè)實(shí)施例,所述第一異常處理模塊進(jìn)一步被配置成在預(yù)定時(shí)間間隔之后,確定是否已經(jīng)成功處理了所述消息。根據(jù)本發(fā)明的一個(gè)實(shí)施例,所述死信處理模塊進(jìn)一步被配置成在預(yù)定時(shí)間間隔之后,確定是否已經(jīng)成功處理所述消息。根據(jù)本發(fā)明的一個(gè)實(shí)施例,所述第二異常處理模塊進(jìn)一步被配置成在預(yù)定時(shí)間間隔之后,確定是否已經(jīng)成功處理了所述消息。根據(jù)本發(fā)明的基于消息隊(duì)列的分布式方法和系統(tǒng)針對(duì)大規(guī)模分布式系統(tǒng),對(duì)MQ解決方案進(jìn)行了有效改進(jìn),解決了存在的諸多缺點(diǎn),包括消費(fèi)消息阻塞;MQ單點(diǎn);發(fā)送消息阻塞;消息不匹配;MQ/消息無(wú)監(jiān)控;消息順序不一致;死信隊(duì)列無(wú)法處理等問題,從而實(shí)現(xiàn)了具有高效實(shí)時(shí)、高擴(kuò)展性、系統(tǒng)松耦合的分布式方法和系統(tǒng)。
附示了本發(fā)明的實(shí)施例,并與說明書一起用于解釋本發(fā)明的原理。在附圖中圖1圖示了根據(jù)本發(fā)明的實(shí)施例的用于基于消息隊(duì)列的分布式系統(tǒng)的示意框圖。圖2圖示了根據(jù)本發(fā)明的實(shí)施例的用于基于消息隊(duì)列的分布式方法的流程圖。圖3圖示了根據(jù)本發(fā)明的實(shí)施例的在隊(duì)列管理器集群中消息的一個(gè)處理流程圖。
具體實(shí)施例方式下面結(jié)合說明書附圖詳細(xì)描述本發(fā)明的實(shí)施例。在消息中間件中,不同的應(yīng)用之間傳遞交換的信息統(tǒng)稱為消息,它是數(shù)據(jù)交換的基本單位。消息可以是各種各樣的媒體,諸如文本、聲音、圖像等。每一個(gè)消息都可以擁有一個(gè)優(yōu)先級(jí)屬性,表示與其他消息的相對(duì)重要性。消息可以包含發(fā)送和接收者的標(biāo)識(shí)、時(shí)間戳、到期時(shí)間等信息。無(wú)法傳遞或已過期的消息被稱為死信。隊(duì)列可以看作一個(gè)容器,用于存放消息。隊(duì)列可以分為很多種類型,例如包括本地隊(duì)列、遠(yuǎn)程隊(duì)列等。本地隊(duì)列按功能又被分為初始化隊(duì)列、傳輸隊(duì)列、目標(biāo)隊(duì)列、死信隊(duì)列等。初始化隊(duì)列用作消息觸發(fā)。傳輸隊(duì)列用于暫時(shí)存放待傳送的消息,在條件許可的情況下將通過管道將消息傳送到其他隊(duì)列管理器。目標(biāo)隊(duì)列是消息的目的地,可以長(zhǎng)期存放消息。死信隊(duì)列是普通的本地隊(duì)列。如果消息不能送達(dá)目標(biāo)隊(duì)列,也不能再路由出去,將自動(dòng)將其放入死信隊(duì)列保存。集群通常指的是由多機(jī)系統(tǒng)共同負(fù)擔(dān)計(jì)算機(jī)任務(wù),如果其中一個(gè)節(jié)點(diǎn)出現(xiàn)故障,則剩余的部分會(huì)接管其工作。從本質(zhì)上看,集群要解決的是系統(tǒng)容錯(cuò)和負(fù)載均衡這兩個(gè)問題。圖1圖示了根據(jù)本發(fā)明的實(shí)施例的用于基于消息隊(duì)列的分布式系統(tǒng)100的示意框圖。如圖1所示,根據(jù)本發(fā)明的用于管理消息隊(duì)列的系統(tǒng)100包括應(yīng)用102、隊(duì)列管理器集群103、應(yīng)用104、注冊(cè)模塊106、監(jiān)控模塊108以及異常處理模塊110和112。應(yīng)用102是發(fā)送方,用于將消息發(fā)送到隊(duì)列管理器集群103,并且可以例如是業(yè)務(wù)系統(tǒng)。應(yīng)用104是接收方,用于從隊(duì)列管理器集群接收消息并且將其發(fā)送到服務(wù)器,并且可以例如是報(bào)表系統(tǒng)。例如,業(yè)務(wù)系統(tǒng)在必要的處理環(huán)節(jié),可以通過消息隊(duì)列推送消息給報(bào)表系統(tǒng),并且在報(bào)表系統(tǒng)偵聽到消息后,對(duì)其進(jìn)行相關(guān)處理。替代地,應(yīng)用102可以是接收方,而應(yīng)用104可以是發(fā)送方。應(yīng)用102和104可以分布于同一臺(tái)機(jī)器上,也可以分布于相連的網(wǎng)絡(luò)空間中的任一位置。而且,可以存在不止一個(gè)應(yīng)用102和104。隊(duì)列管理器集群103用于從應(yīng)用102接收消息、處理本地消息并且將消息發(fā)送到應(yīng)用104。隊(duì)列管理器集群103可以包括一個(gè)或多個(gè)隊(duì)列管理器。為了簡(jiǎn)單說明,在此僅示出了兩個(gè)隊(duì)列管理器114和116。隊(duì)列管理器114和116用于管理所有的消息隊(duì)列,包括消息的出隊(duì)、入隊(duì)以及分發(fā)到其他隊(duì)列管理器。隊(duì)列管理器114和116可以是本地隊(duì)列管理器,也可以是遠(yuǎn)程隊(duì)列管理器,而且它們也可以是不同操作系統(tǒng)上的隊(duì)列管理器。根據(jù)本發(fā)明的實(shí)施例,隊(duì)列管理器114包括消息處理模塊118和死信處理模塊120,而隊(duì)列管理器116包括消息處理模塊122和死信處理模塊124。解決發(fā)送消息阻塞在現(xiàn)有技術(shù)中,如果消息發(fā)送方由于隊(duì)列管理器或消息接收方等問題而無(wú)法成功發(fā)送消息,則造成發(fā)送消息阻塞,從而消息丟失。在根據(jù)本發(fā)明的實(shí)施例中,如果應(yīng)用102不能成功發(fā)送消息,則將沒有成功處理的消息放入異常處理模塊110,該異常處理模塊110將對(duì)該沒有成功處理的消息進(jìn)行處理,并且在成功處理該消息之后,由異常處理模塊Iio將其發(fā)送到隊(duì)列管理器集群103,由此避免了消息阻塞的問題。異常處理模塊110可以包括異常數(shù)據(jù)庫(kù),在這種情況下在異常數(shù)據(jù)庫(kù)中利用worker來處理沒有成功處理的消息。此外,也可以對(duì)進(jìn)入異常處理模塊110的沒有成功處理的消息設(shè)定優(yōu)先級(jí),并根據(jù)優(yōu)先級(jí)對(duì)這些消息進(jìn)行處理,使得能夠優(yōu)先處理重要事件,從而使消息傳遞更有效率。如果異常處理模塊110對(duì)沒有成功處理的消息進(jìn)行處理的次數(shù)或時(shí)間達(dá)到預(yù)定閾值仍然不成功,則通過監(jiān)控模塊108提示進(jìn)行人工處理,以避免死循環(huán)。解決MQ故障在現(xiàn)有技術(shù)中,由于MQ是單點(diǎn),所以如果隊(duì)列管理器出現(xiàn)故障,則業(yè)務(wù)處理將失敗。在根據(jù)本發(fā)明的實(shí)施例中,將隊(duì)列管理器實(shí)現(xiàn)為隊(duì)列管理器集群,集群內(nèi)部的隊(duì)列管理器之間進(jìn)行通信時(shí),不需要兩兩之間建立通信信道,并且集群中的隊(duì)列管理器之間能夠自動(dòng)進(jìn)行負(fù)載均衡。如圖1所示,隊(duì)列管理器集群103包括多個(gè)并行設(shè)置的隊(duì)列管理器。為了簡(jiǎn)單解釋起見,圖1中僅示出了兩個(gè)隊(duì)列管理器114和116。而且,隊(duì)列管理器集群103可以水平擴(kuò)展。如果隊(duì)列管理器集群103中的一個(gè)隊(duì)列管理器出現(xiàn)故障或因其他原因而不工作,例如,隊(duì)列管理器114出現(xiàn)故障,則隊(duì)列管理器集群103可以自動(dòng)將其隔離,使得不會(huì)再有新的消息路由到隊(duì)列管理器114,并且由隊(duì)列管理器116接管隊(duì)列管理器114的工作,從而避免了業(yè)務(wù)處理失敗。因此,系統(tǒng)100可以在充分利用現(xiàn)有資源、簡(jiǎn)化系統(tǒng)配置的同時(shí),大大提高了消息傳送的可靠性。解決死信隊(duì)列無(wú)法處理如已知的,每個(gè)隊(duì)列管理器都具有死信隊(duì)列,死信隊(duì)列保存的是未送達(dá)的消息。未送達(dá)可能是例如由于網(wǎng)絡(luò)或目的地等問題造成的。雖然死信隊(duì)列的設(shè)置可以一定程度上防止通道關(guān)閉或減少影響隊(duì)列管理器的正常操作,但是如果死信過多,則仍然會(huì)對(duì)隊(duì)列管理器甚至整個(gè)系統(tǒng)造成不利影響。根據(jù)本發(fā)明的實(shí)施例,隊(duì)列管理器118和122分別包括死信處理模塊120和124。死信處理模塊120、124用于對(duì)死信進(jìn)行處理。死信處理模塊120和124的設(shè)置使得可以在沒有人工介入的情況下自動(dòng)處理死信隊(duì)列,從而有效避免了死信的積壓并提高了系統(tǒng)效率。具體地,死信處理模塊120和124例如可以基于死信產(chǎn)生的原因、死信的目的地等等因素來進(jìn)行重發(fā)、轉(zhuǎn)發(fā)、刪除等處理。死信產(chǎn)生的原因例如包括目標(biāo)隊(duì)列已經(jīng)滿了、目標(biāo)隊(duì)列不存在、消息不允許被放置在隊(duì)列中、發(fā)送者沒有被授權(quán)使用目標(biāo)隊(duì)列、消息過大、消息含有重復(fù)的序列號(hào)等等。例如,對(duì)于暫時(shí)性錯(cuò)誤,死信處理模塊120、124可以采取重試的策略,但是死信處理模塊120、124應(yīng)當(dāng)控制重試的間隔和/或次數(shù),例如可以事先設(shè)置預(yù)定的時(shí)間間隔和/或次數(shù)??蛇x地,可以在每一次重試之間增大間隔時(shí)間,從而防止增大系統(tǒng)的負(fù)荷。例如,對(duì)于由于系統(tǒng)繁忙引起的錯(cuò)誤,死信處理模塊120、124可以盡可能降低吞吐從而減少恢復(fù)的時(shí)間。然而,如果死信處理模塊120、124在超過預(yù)定的時(shí)間間隔和/或次數(shù)之后仍未成功處理死信,則通過監(jiān)控模塊108將錯(cuò)誤報(bào)告給管理員,以便人工介入分析原因。解決消費(fèi)消息阻塞在現(xiàn)有技術(shù)中,業(yè)務(wù)涉及完全依賴于隊(duì)列管理器。也就是,只有數(shù)據(jù)處理成功之后,才消費(fèi)消息。如果接收方出現(xiàn)故障,則會(huì)造成堵塞,過多堵塞甚至造成消息積壓,以致使報(bào)表系統(tǒng)無(wú)法工作,甚至因?yàn)樗佬抨?duì)列過大而引發(fā)隊(duì)列管理器故障。在根據(jù)本發(fā)明的實(shí)施例中,隊(duì)列管理器114、116僅用作一個(gè)通知系統(tǒng),它們與應(yīng)用104解耦,也就是說應(yīng)用104本身直接消費(fèi)消息。如果應(yīng)用104本身出現(xiàn)故障或沒有成功處理消息,則該消息被放入異常處理模塊112,該異常處理模塊112將對(duì)該消息進(jìn)行處理,由此避免了消息阻塞的問題。另外,異常處理模塊112可以包括異常數(shù)據(jù)庫(kù),在這種情況下在異常數(shù)據(jù)庫(kù)中利用worker來處理沒有成功處理的消息。類似地,也可以對(duì)進(jìn)入異常處理模塊112的沒有成功處理的消息設(shè)定優(yōu)先級(jí),并根據(jù)優(yōu)先級(jí)對(duì)這些消息進(jìn)行處理,從而使消息傳遞更有效率。如果異常處理模塊112對(duì)沒有成功處理的消息進(jìn)行處理的次數(shù)或時(shí)間達(dá)到預(yù)定閾值仍然不成功,則通過監(jiān)控模塊108提示進(jìn)行人工處理,以避免死循環(huán)。解決消息不匹配在現(xiàn)有技術(shù)中,消息生產(chǎn)者和消費(fèi)者利用配置文件獨(dú)立定義消息,缺乏匹配檢查。如果消息生產(chǎn)者和消費(fèi)者的消息不一致,則會(huì)造成報(bào)表數(shù)據(jù)不準(zhǔn)或者產(chǎn)生大量死信隊(duì)列。根據(jù)本發(fā)明的實(shí)施例,作為消息生產(chǎn)者的應(yīng)用102和作為消息消費(fèi)者的應(yīng)用104需要通過注冊(cè)模塊106進(jìn)行注冊(cè),并且在系統(tǒng)100啟動(dòng)時(shí)注冊(cè)模塊106進(jìn)行消息匹配檢查,如果出現(xiàn)消息不一致的情況,則系統(tǒng)100不能啟動(dòng),避免上線出現(xiàn)問題。該消息集中注冊(cè)機(jī)制可以防止出現(xiàn)數(shù)據(jù)不準(zhǔn)或大量死信隊(duì)列的產(chǎn)生。解決MQ/消息無(wú)監(jiān)控在現(xiàn)有技術(shù)中,由于沒有對(duì)隊(duì)列管理器和/或消息進(jìn)行監(jiān)控,因此在出現(xiàn)異常的情況下,不能做到提前預(yù)警,也無(wú)法知道發(fā)送和/或接收數(shù)量是否準(zhǔn)確。根據(jù)本發(fā)明的實(shí)施例,系統(tǒng)100包括監(jiān)控模塊108,該監(jiān)控模塊108對(duì)應(yīng)用102、隊(duì)列管理器集群103、應(yīng)用104的各項(xiàng)指標(biāo)進(jìn)行監(jiān)控,并根據(jù)需要相應(yīng)地發(fā)出警報(bào)。例如,監(jiān)控模塊108可以對(duì)發(fā)送和消費(fèi)消息數(shù)量進(jìn)行統(tǒng)計(jì)監(jiān)控。例如,如果正常隊(duì)列超過某個(gè)閾值(例如,5000條),則監(jiān)控模塊108就會(huì)報(bào)警。又例如,如果死信隊(duì)列有數(shù)據(jù),則監(jiān)控模塊108就會(huì)報(bào)警。通常,如上所述,對(duì)于應(yīng)用或隊(duì)列管理器自己能夠處理和解決的可恢復(fù)的錯(cuò)誤是由其相應(yīng)的異常處理模塊110、112或死信處理模塊120、124自行處理,例如,連接失敗(可以按照一定規(guī)則重新連接)、暫時(shí)的錯(cuò)誤(可以稍后進(jìn)行重試)。然而,對(duì)于在進(jìn)行人工介入之前不可能由應(yīng)用程序恢復(fù)的錯(cuò)誤是由監(jiān)控模塊108通知給管理員,例如,應(yīng)用錯(cuò)誤(例如,使用了不正確的參數(shù))、系統(tǒng)錯(cuò)誤(例如,硬件問題、磁盤滿或隊(duì)列損壞等)以及軟件問題(例如,其他應(yīng)用停止工作導(dǎo)致隊(duì)列滿等)。然而,如果對(duì)可恢復(fù)的錯(cuò)誤處理若干次后,仍然不能成功處理的情況下,則認(rèn)為這個(gè)錯(cuò)誤是不可恢復(fù)。在這種情況下,通過監(jiān)控模塊108將該情況通知給管理員,同時(shí)釋放其他相關(guān)的資源。例如,如果當(dāng)前鏈接失效或中斷,則應(yīng)用或隊(duì)列管理器可以重新建立連接并嘗試重新開始操作,但是如果在重試預(yù)定次數(shù)和/或預(yù)定時(shí)間間隔之后,仍未能成功連接,則應(yīng)用或隊(duì)列管理器通過監(jiān)控模塊108將該情況通知給管理員,以保證系統(tǒng)正常運(yùn)行并防止意外的發(fā)生。對(duì)本領(lǐng)域技術(shù)人員顯而易見的是,對(duì)于以上描述的發(fā)送消息阻塞、MQ故障、死信隊(duì)列無(wú)法處理、消費(fèi)消息阻塞、消息不匹配以及MQ/消息無(wú)監(jiān)控的問題的解決方案,可以同時(shí)應(yīng)用以上所有的技術(shù)方案,也可以選擇性地應(yīng)用以上解決方案中的一個(gè)或多個(gè)。例如,可以僅應(yīng)用針對(duì)發(fā)送消息阻塞的技術(shù)方案。替代地,可以應(yīng)用包括針對(duì)發(fā)送消息阻塞和MQ/消息無(wú)監(jiān)控的技術(shù)方案,等等。圖2圖示了根據(jù)本發(fā)明的實(shí)施例的用于基于消息隊(duì)列的分布式方法的流程圖200。如圖2所示,根據(jù)本發(fā)明的實(shí)施例的方法的流程圖200,在步驟204中,應(yīng)用102向隊(duì)列管理器集群103發(fā)送消息。在可選步驟206中,確定該消息是否成功發(fā)送。如果在步驟206中確定沒有成功發(fā)送,則在步驟208中,該消息被放入異常處理模塊110進(jìn)行處理。然后,在可選步驟210中,確定是否已經(jīng)成功處理了該消息。如果在預(yù)定時(shí)間間隔之后,仍然沒有成功處理該消息,則在步驟212中,向監(jiān)控模塊108報(bào)告該情況。如果在步驟210中確定已經(jīng)成功處理了該消息,則在步驟214中異常處理模塊110將該消息發(fā)送到隊(duì)列管理器集群103。如果在步驟206中確定已經(jīng)成功發(fā)送了消息或者在步驟214中異常處理模塊110將成功處理的消息發(fā)送到隊(duì)列管理器集群103,則在步驟216中,隊(duì)列管理器集群103對(duì)所接收到的消息進(jìn)行處理。然后,在可選步驟218中,確定該消息是否是死信。如果在步驟218中確定該消息是死信,則在步驟220中,該消息被放入死信處理模塊120中進(jìn)行處理。接著,在可選步驟222中,確定該消息是否已經(jīng)被成功處理。如果在預(yù)定時(shí)間間隔之后,仍然沒有成功處理該消息,則在步驟224中,向監(jiān)控模塊108報(bào)告該情況。如果在步驟218中確定該消息不是死信或者在步驟222中確定已經(jīng)成功處理了該消息,則隊(duì)列管理器集群103向應(yīng)用104發(fā)送該消息。在步驟228中,應(yīng)用104從隊(duì)列管理器集群103接收消息并對(duì)所接收到的消息進(jìn)行處理。然后,在可選步驟230中,確定是否成功處理了所接收到的消息。如果在步驟230中確定沒有成功處理所接收到的消息,則在步驟232中,沒有成功處理的消息被放入異常處理模塊中進(jìn)行處理。然后,在可選步驟234中,確定是否已經(jīng)成功處理了該消息。如果在預(yù)定時(shí)間間隔之后,仍然沒有成功處理該消息,則在步驟236中,向監(jiān)控模塊108報(bào)告該情況。如果在步驟230中確定已經(jīng)成功處理了該消息或者在步驟234中確定已經(jīng)成功處理了該消息,則該流程圖200結(jié)束。應(yīng)當(dāng)理解,對(duì)于上述流程圖200中的可選步驟206、210、218、222、230和234,可以同時(shí)應(yīng)用所有的可選步驟,也可以選擇性地應(yīng)用以上可選步驟中的一個(gè)或多個(gè)。例如,在可選步驟206、210、218、222、230和234當(dāng)中,可以僅應(yīng)用可選步驟206。替代地,可以應(yīng)用可選步驟206和218,等等。而且,在根據(jù)本發(fā)明的一個(gè)實(shí)施例中,在應(yīng)用102向隊(duì)列管理器集群103發(fā)送消息之前,注冊(cè)模塊106可以對(duì)消息進(jìn)行匹配檢查。僅當(dāng)消息匹配時(shí),才繼續(xù)后續(xù)操作。圖3圖示了根據(jù)本發(fā)明的實(shí)施例的在隊(duì)列管理器集群中消息的一個(gè)處理流程圖。在隊(duì)列管理器是隊(duì)列管理器集群的情況下,如圖3所示,流程圖200可以進(jìn)一步包括以下步驟。在步驟302中,確定隊(duì)列管理器集群103中的一個(gè)隊(duì)列管理器(例如,隊(duì)列管理器114)未能正常工作。然后,在步驟304中,隔離該未能正常工作的隊(duì)列管理器,使得不會(huì)再有新的消息路由到該隊(duì)列管理器。在步驟306中,由其余的隊(duì)列管理器(例如,隊(duì)列管理器116)接管未能正常工作的隊(duì)列管理器的工作。根據(jù)本發(fā)明的基于消息隊(duì)列的分布式方法和系統(tǒng)針對(duì)現(xiàn)有MQ解決方案中的諸多問題改進(jìn)了現(xiàn)有大規(guī)模分布式系統(tǒng)MQ解決方案,提高了系統(tǒng)性能、穩(wěn)定性和安全性。上述實(shí)施例僅是本發(fā)明的優(yōu)選實(shí)施例,并不用于限制本發(fā)明。對(duì)本領(lǐng)域技術(shù)人員顯而易見的是,在不脫離本發(fā)明的精神和范圍的情況下,可以對(duì)本發(fā)明的實(shí)施例進(jìn)行各種修改和改變。因此,本發(fā)明意在涵蓋落入如權(quán)利要求所限定的本發(fā)明的范圍之內(nèi)的所有這樣的修改或變型。
權(quán)利要求
1.一種基于消息隊(duì)列的分布式方法,包括由第一應(yīng)用向隊(duì)列管理器發(fā)送消息;確定所述消息是否成功發(fā)送;如果確定沒有成功發(fā)送所述消息,則所述消息被放入第一異常處理模塊進(jìn)行處理; 如果確定已經(jīng)成功發(fā)送所述消息,則由所述隊(duì)列管理器對(duì)所接收到的消息進(jìn)行處理; 將所述消息發(fā)送到第二應(yīng)用;以及由所述第二應(yīng)用對(duì)所接收到的消息進(jìn)行處理。
2.根據(jù)權(quán)利要求1所述的方法,其中所述由所述隊(duì)列管理器對(duì)所接收到的消息進(jìn)行處理的步驟進(jìn)一步包括確定所述消息是否是死信;以及如果確定所述消息是死信,則所述消息被放入死信處理模塊以進(jìn)行處理。
3.根據(jù)權(quán)利要求1所述的方法,其中所述由第二應(yīng)用對(duì)所接收到的消息進(jìn)行處理的步驟進(jìn)一步包括確定所述第二應(yīng)用是否已經(jīng)成功處理了所述消息;以及如果確定沒有成功處理所述消息,則所述消息被放入第二異常處理模塊進(jìn)行處理。
4.根據(jù)權(quán)利要求1所述的方法,其中所述消息被放入第一異常處理模塊進(jìn)行處理的步驟進(jìn)一步包括確定所述第一異常處理模塊是否已經(jīng)成功處理了所述消息;如果確定沒有成功處理所述消息,則向監(jiān)控模塊報(bào)告該情況;以及如果確定已經(jīng)成功處理了所述消息,則將所述消息發(fā)送到所述隊(duì)列管理器。
5.根據(jù)權(quán)利要求2所述的方法,其中所述消息被放入死信處理模塊以進(jìn)行處理的步驟進(jìn)一步包括確定所述死信處理模塊是否已經(jīng)成功處理所述消息;以及如果確定沒有成功處理所述消息,則向監(jiān)控模塊報(bào)告該情況。
6.根據(jù)權(quán)利要求3所述的方法,其中所述消息被放入第二異常處理模塊進(jìn)行處理的步驟進(jìn)一步包括確定所述第二異常處理模塊是否已經(jīng)成功處理了所述消息;以及如果確定沒有成功處理所述消息,則向監(jiān)控模塊報(bào)告該情況。
7.根據(jù)權(quán)利要求1所述的方法,其中在所述第一應(yīng)用向所述隊(duì)列管理器發(fā)送所述消息之前,注冊(cè)模塊可以對(duì)所述消息進(jìn)行匹配檢查,并且僅當(dāng)所述消息匹配時(shí),才繼續(xù)后續(xù)操作。
8.根據(jù)權(quán)利要求1所述的方法,其中所述隊(duì)列管理器是隊(duì)列管理器集群。
9.根據(jù)權(quán)利要求8所述的方法,其中所述由隊(duì)列管理器對(duì)所接收到的消息進(jìn)行處理進(jìn)一步包括確定所述隊(duì)列管理器集群中的一個(gè)隊(duì)列管理器未能正常工作;隔離所述一個(gè)隊(duì)列管理器,使得不會(huì)再有新的消息路由到所述一個(gè)隊(duì)列管理器;以及由其余的隊(duì)列管理器接管所述一個(gè)隊(duì)列管理器的工作。
10.根據(jù)權(quán)利要求4所述的方法,其中所述確定所述第一異常處理模塊是否已經(jīng)成功處理了所述消息的步驟在預(yù)定時(shí)間間隔之后執(zhí)行。
11.根據(jù)權(quán)利要求5所述的方法,其中所述確定所述死信處理模塊是否已經(jīng)成功處理所述消息的步驟在預(yù)定時(shí)間間隔之后執(zhí)行。
12.根據(jù)權(quán)利要求6所述的方法,其中所述確定所述第二異常處理模塊是否已經(jīng)成功處理了所述消息的步驟在預(yù)定時(shí)間間隔之后執(zhí)行。
13.—種基于消息隊(duì)列的分布式系統(tǒng),包括第一應(yīng)用,所述第一應(yīng)用被配置成向隊(duì)列管理器發(fā)送消息;第一異常處理模塊,所述第一異常處理模塊連接到所述第一應(yīng)用,并且被配置成對(duì)所述第一應(yīng)用沒有成功發(fā)送的消息進(jìn)行處理;隊(duì)列管理器,所述隊(duì)列管理器與所述第一應(yīng)用和所述第一異常處理模塊相連,并且被配置成對(duì)所接收到的消息進(jìn)行處理并且將所述消息發(fā)送到第二應(yīng)用;以及第二應(yīng)用,所述第二應(yīng)用連接到所述隊(duì)列管理器,并且被配置成對(duì)所接收到的消息進(jìn)行處理。
14.根據(jù)權(quán)利要求13所述的系統(tǒng),進(jìn)一步包括監(jiān)控模塊,所述監(jiān)控模塊被配置成對(duì)所述第一應(yīng)用、所述隊(duì)列管理器和所述第二應(yīng)用進(jìn)行監(jiān)控。
15.根據(jù)權(quán)利要求13或14所述的系統(tǒng),其中所述隊(duì)列管理器進(jìn)一步包括死信處理模塊,所述死信處理模塊被配置成對(duì)死信進(jìn)行處理。
16.根據(jù)權(quán)利要求13或14所述的系統(tǒng),其中所述第二應(yīng)用進(jìn)一步包括第二異常處理模塊,所述第二異常處理模塊被配置成對(duì)所述第二應(yīng)用沒有成功處理的消息進(jìn)行處理。
17.根據(jù)權(quán)利要求14所述的系統(tǒng),其中所述第一異常處理模塊進(jìn)一步被配置成確定是否已經(jīng)成功處理了所述消息;如果確定沒有成功處理所述消息,則向所述監(jiān)控模塊報(bào)告該情況;以及如果確定已經(jīng)成功處理了所述消息,則將所述消息發(fā)送到所述隊(duì)列管理器。
18.根據(jù)權(quán)利要求15所述的系統(tǒng),其中所述死信處理模塊進(jìn)一步被配置成確定所述死信處理模塊是否已經(jīng)成功處理所述消息;以及如果確定沒有成功處理所述消息,則向所述監(jiān)控模塊報(bào)告該情況。
19.根據(jù)權(quán)利要求16所述的系統(tǒng),其中所述第二異常處理模塊進(jìn)一步被配置成確定是否已經(jīng)成功處理了所述消息;以及如果確定沒有成功處理所述消息,則向所述監(jiān)控模塊報(bào)告該情況。
20.根據(jù)權(quán)利要求13所述的系統(tǒng),進(jìn)一步包括注冊(cè)模塊,所述注冊(cè)模塊被配置成對(duì)所述消息進(jìn)行匹配檢查,并且僅當(dāng)所述消息匹配時(shí),才繼續(xù)后續(xù)操作。
21.根據(jù)權(quán)利要求13所述的系統(tǒng),其中所述隊(duì)列管理器是隊(duì)列管理器集群。
22.根據(jù)權(quán)利要求21所述的系統(tǒng),其中所述隊(duì)列管理器集群進(jìn)一步被配置成確定所述隊(duì)列管理器集群中的一個(gè)隊(duì)列管理器未能正常工作;隔離所述一個(gè)隊(duì)列管理器,使得不會(huì)再有新的消息路由到所述一個(gè)隊(duì)列管理器;以及由其余的隊(duì)列管理器接管所述一個(gè)隊(duì)列管理器的工作。
23.根據(jù)權(quán)利要求17所述的系統(tǒng),其中所述第一異常處理模塊進(jìn)一步被配置成在預(yù)定時(shí)間間隔之后,確定是否已經(jīng)成功處理了所述消息。
24.根據(jù)權(quán)利要求18所述的系統(tǒng),其中所述死信處理模塊進(jìn)一步被配置成在預(yù)定時(shí)間間隔之后,確定是否已經(jīng)成功處理所述消息。
25.根據(jù)權(quán)利要求19所述的系統(tǒng),其中所述第二異常處理模塊進(jìn)一步被配置成在預(yù)定時(shí)間 間隔之后,確定是否已經(jīng)成功處理了所述消息。
全文摘要
本發(fā)明提供一種基于消息隊(duì)列的分布式方法和系統(tǒng)。該基于消息隊(duì)列的分布式方法包括由第一應(yīng)用向隊(duì)列管理器發(fā)送消息;確定所述消息是否成功發(fā)送;如果確定沒有成功發(fā)送所述消息,則所述消息被放入第一異常處理模塊進(jìn)行處理;如果確定已經(jīng)成功發(fā)送所述消息,則由所述隊(duì)列管理器對(duì)所接收到的消息進(jìn)行處理;將所述消息發(fā)送到第二應(yīng)用;以及由所述第二應(yīng)用對(duì)所接收到的消息進(jìn)行處理。
文檔編號(hào)G06F9/54GK103019866SQ20121041048
公開日2013年4月3日 申請(qǐng)日期2012年10月24日 優(yōu)先權(quán)日2012年10月24日
發(fā)明者李鵬濤 申請(qǐng)人:北京京東世紀(jì)貿(mào)易有限公司