專利名稱:一種發(fā)送消息的方法及其系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本申請(qǐng)涉及計(jì)算機(jī)分布式系統(tǒng)領(lǐng)域,尤其涉及一種分布式系統(tǒng)中發(fā)送消息的方法及其系統(tǒng)。
背景技術(shù):
隨著淘寶商城不斷發(fā)展,其中的商家不斷增加,用戶也越來越多,為了更好實(shí)現(xiàn)對(duì)用戶的服務(wù)或商家的服務(wù),就需要將很多消息要發(fā)給商家或用戶,如發(fā)送旺旺消息,淘寶站內(nèi)的信,短消息及郵件等。一般情況下,上述信息都是通過分布式系統(tǒng)發(fā)送消息給用戶或商家,而為了使消息能夠高效的發(fā)送,分布式系統(tǒng)采用并發(fā)的方式發(fā)送消息。下面請(qǐng)參考圖1,其為本申請(qǐng)實(shí)施例中分布式系統(tǒng)消息分發(fā)的結(jié)構(gòu)示意圖。消息發(fā)送系統(tǒng)提供對(duì)外接口,以接收來自發(fā)送者的消息并保存在消息隊(duì)列中,再由消息發(fā)送進(jìn)程分發(fā)給接收者。本申請(qǐng)發(fā)明人在實(shí)現(xiàn)本申請(qǐng)實(shí)施例中技術(shù)方案的過程中,發(fā)現(xiàn)上述現(xiàn)有技術(shù)至少存在如下技術(shù)問題:在讀取消息隊(duì)列的過程中,系統(tǒng)采用單線程讀取多線程分發(fā)的模式,即每次只保證有一個(gè)進(jìn)程在讀取消息,然后再開始分發(fā)消息。因需保證只有一個(gè)進(jìn)程在讀取消息,系統(tǒng)引入了鎖競(jìng)爭(zhēng),故而每次進(jìn)程都需要判斷是否可讀。具體來說,系統(tǒng)通過加鎖的方式保證只有一個(gè)進(jìn)程在讀取,由于數(shù)據(jù)庫(kù)本身機(jī)制的原因,在多線程并發(fā)的情況下,可能會(huì)造成死鎖。并發(fā)的線程越多,造成死鎖的概率就越大??梢?,在現(xiàn)有技術(shù)中,多進(jìn)程讀取消息使得系統(tǒng)在發(fā)送消息的過程中,非常容易造成死鎖,從而降低系統(tǒng)發(fā)送消息的效率。
發(fā)明內(nèi)容
本申請(qǐng)?zhí)峁┝艘环N發(fā)送消息的方法及其系統(tǒng),以解決了因保證只有一個(gè)任務(wù)在讀取消息時(shí)而造成的死鎖的技術(shù)問題,消除了鎖競(jìng)爭(zhēng),提高了消息發(fā)送效率。一方面,通過本申請(qǐng)的一個(gè)實(shí)施例,提供如下技術(shù)方案:一種發(fā)送消息的方法,應(yīng)用在包括有數(shù)據(jù)庫(kù),與所述數(shù)據(jù)庫(kù)連接的M個(gè)應(yīng)用服務(wù)器和與所述數(shù)據(jù)庫(kù)連接的至少N個(gè)消息任務(wù)服務(wù)器的系統(tǒng)中,其中,所述N個(gè)消息任務(wù)服務(wù)器中每個(gè)消息任務(wù)服務(wù)器包括有一個(gè)消息發(fā)送進(jìn)程,M為大于或等于I的整數(shù),N為大于或等于2的整數(shù),所述方法包括:判斷所述N個(gè)消息發(fā)送進(jìn)程中每個(gè)消息發(fā)送進(jìn)程的狀態(tài)是否是有效狀態(tài);基于所述判斷,從所述N個(gè)消息發(fā)送進(jìn)程中確定K個(gè)消息發(fā)送進(jìn)程的狀為有效狀態(tài),其中K為大于I但小于N的整數(shù);從所述K個(gè)消息發(fā)送進(jìn)程中,確定一個(gè)消息發(fā)送進(jìn)程作為主消息發(fā)送進(jìn)程;
通過所述主消息發(fā)送進(jìn)程去啟動(dòng)所述主消息發(fā)送進(jìn)程所在消息任務(wù)服務(wù)器中的消息調(diào)度器;通過所述消息調(diào)度器,從所述數(shù)據(jù)庫(kù)的消息隊(duì)列中獲得至少一個(gè)沒有進(jìn)程歸屬的待發(fā)送消息;從所述K個(gè)消息發(fā)送進(jìn)程中,為所述至少一個(gè)沒有進(jìn)程歸屬的待發(fā)送消息中每個(gè)待發(fā)送消息分配一個(gè)消息發(fā)送進(jìn)程;通過所述K個(gè)消息發(fā)送進(jìn)程發(fā)送所述至少一個(gè)沒有進(jìn)程歸屬的待發(fā)送消息。另一方面,通過本申請(qǐng)的一個(gè)實(shí)施例,提供如下技術(shù)方案:一種發(fā)送消息的系統(tǒng),包括:M個(gè)應(yīng)用服務(wù)器,與至少一個(gè)發(fā)送端連接,用于接收所述至少一個(gè)發(fā)送端發(fā)送的待發(fā)送消息,其中,所述M個(gè)應(yīng)用服務(wù)器中每個(gè)應(yīng)用服務(wù)器包括一個(gè)消息發(fā)送接口,M為大于或等于I的整數(shù);數(shù)據(jù)庫(kù),與所述M個(gè)應(yīng)用服務(wù)器連接,用于通過每個(gè)應(yīng)用服務(wù)器的所述消息發(fā)送,接收所述至少一個(gè)待發(fā)送消息,并將所述至少一個(gè)待發(fā)送消息放在一消息隊(duì)列中;N個(gè)消息任務(wù)服務(wù)器,與所述數(shù)據(jù)庫(kù)連接,所述N個(gè)消息任務(wù)服務(wù)器中每個(gè)消息任務(wù)服務(wù)器包括有一個(gè)消息發(fā)送進(jìn)程;其中,所述N個(gè)消息發(fā)送進(jìn)程中有K個(gè)消息發(fā)送進(jìn)程的狀態(tài)為有效狀態(tài),所述K個(gè)消息發(fā)送進(jìn)程中有一個(gè)為主消息發(fā)送進(jìn)程;其中,所述主消息發(fā)送進(jìn)程對(duì)應(yīng)的消息任務(wù)服務(wù)器用于:通過所述主消息發(fā)送進(jìn)程啟動(dòng)所述主消息發(fā)送進(jìn)程所在消息任務(wù)服務(wù)器中的消息調(diào)度器;通過所述消息調(diào)度器,從所述數(shù)據(jù)庫(kù)的消息隊(duì)列中獲得至少一個(gè)沒有進(jìn)程歸屬的待發(fā)送消息;從所述K個(gè)消息發(fā)送進(jìn)程中,為所述至少一個(gè)沒有進(jìn)程歸屬的待發(fā)送消息中每個(gè)待發(fā)送消息分配一個(gè)消息發(fā)送進(jìn)程;通過所述K個(gè)消息發(fā)送進(jìn)程發(fā)送所述至少一個(gè)沒有進(jìn)程歸屬的待發(fā)送消息。上述技術(shù)方案中的一個(gè)或多個(gè)技術(shù)方案具有如下優(yōu)點(diǎn)或有益效果:一、通過采用在任務(wù)分發(fā)過程中進(jìn)行消息調(diào)度的方法,解決了任務(wù)分發(fā)過程中任務(wù)競(jìng)爭(zhēng)消息造成死鎖的技術(shù)問題,從而避免了死鎖,達(dá)到了高效發(fā)送消息的技術(shù)效果。二、由于在消息分發(fā)的過程中采用了心跳檢測(cè)的技術(shù)手段,解決了消息發(fā)送過程中,檢測(cè)各個(gè)任務(wù)的有效性,從而達(dá)到了及時(shí)更新任務(wù)狀態(tài)的技術(shù)效果。三、通過采用消息調(diào)度算法和心跳檢測(cè)的技術(shù)手段,解決了消息在發(fā)送過程中,因任務(wù)暫停而導(dǎo)致消息閑置等待處理的問題,從而達(dá)到了智能的將未發(fā)送完成的消息轉(zhuǎn)移到可用任務(wù)的技術(shù)效果。
圖1為現(xiàn)有技術(shù)中分布式系統(tǒng)消息分發(fā)的結(jié)構(gòu)示意圖;圖2為本申請(qǐng)實(shí)施例一中消息發(fā)送的方法流程圖;圖3為本申請(qǐng)實(shí)施例中分配消息發(fā)送進(jìn)程的流程圖;圖4為本申請(qǐng)實(shí)施例中發(fā)送待發(fā)送消息的流程圖5為本申請(qǐng)實(shí)施例中消息分配的示例圖;圖6為本申請(qǐng)實(shí)施例中消息發(fā)送進(jìn)程的總體流程圖;圖7為本申請(qǐng)實(shí)施例中主消息發(fā)送進(jìn)程的調(diào)度流程圖;圖8為本申請(qǐng)實(shí)施例中分布式系統(tǒng)功能模塊圖。
具體實(shí)施例方式為了使本申請(qǐng)所屬技術(shù)領(lǐng)域中的技術(shù)人員更清楚地理解本申請(qǐng),下面結(jié)合附圖,通過具體的實(shí)施例對(duì)本申請(qǐng)技術(shù)方案作詳細(xì)描述。本申請(qǐng)實(shí)施例一提供了 一種消息發(fā)送方法,在本實(shí)施例中,所述方法應(yīng)用在一個(gè)包括有數(shù)據(jù)庫(kù)、應(yīng)用服務(wù)器和消息任務(wù)服務(wù)器的系統(tǒng)中,所述應(yīng)用服務(wù)器用于產(chǎn)生消息,t匕如產(chǎn)生淘寶站內(nèi)信、短消息和發(fā)送郵件等等,所述數(shù)據(jù)庫(kù)用于存放所述應(yīng)用服務(wù)器產(chǎn)生的此類消息信息,當(dāng)消息任務(wù)服務(wù)器需要從數(shù)據(jù)庫(kù)中提取消息時(shí),數(shù)據(jù)庫(kù)就按照消息隊(duì)列的順序?qū)⒋娣诺南鹘o所述消息任務(wù)服務(wù)器。而所述消息任務(wù)服務(wù)器就對(duì)所述數(shù)據(jù)庫(kù)存放的消息進(jìn)行調(diào)度以及將上述消息進(jìn)行發(fā)送。所述消息任務(wù)服務(wù)器在進(jìn)行調(diào)度的時(shí),由于采用多進(jìn)程機(jī)制,因此消息任務(wù)服務(wù)器會(huì)為每個(gè)消息調(diào)度進(jìn)程自動(dòng)分配編號(hào)或者由技術(shù)人員根據(jù)實(shí)際情況具體設(shè)定。下面請(qǐng)參考圖2,為本申請(qǐng)實(shí)施例一中消息發(fā)送的方法流程圖;步驟200,判斷所述N個(gè)消息發(fā)送進(jìn)程中每個(gè)消息發(fā)送進(jìn)程的狀態(tài)是否是有效狀態(tài);在具體的實(shí)施過程中,應(yīng)用服務(wù)器將創(chuàng)建的消息存放在數(shù)據(jù)庫(kù)中,消息任務(wù)服務(wù)器將基于創(chuàng)建的消息,創(chuàng)建多個(gè)消息發(fā)送進(jìn)程,以N作為參數(shù)表示所述多個(gè)消息發(fā)送進(jìn)程,具體來講,該步驟將從N個(gè)消息發(fā)送進(jìn)程中,判斷每個(gè)消息發(fā)送進(jìn)程的狀態(tài)是否是有效狀態(tài),可以是判斷每個(gè)消息發(fā)送進(jìn)程是否已經(jīng)注冊(cè),若是注冊(cè)的消息發(fā)送進(jìn)程,其狀態(tài)即為有效,反之,消息發(fā)送進(jìn)程的狀態(tài)則為無效。步驟210,基于所述判斷,從所述N個(gè)消息發(fā)送進(jìn)程中確定K個(gè)消息發(fā)送進(jìn)程的狀為有效狀態(tài);在具體的實(shí)施過程中,基于步驟200的判斷,從所述N個(gè)消息發(fā)送進(jìn)程中確定K個(gè)消息發(fā)送進(jìn)程的狀態(tài)為有效狀態(tài),所述K僅作為一個(gè)表示有效狀態(tài)的消息發(fā)送進(jìn)程的參數(shù),因?yàn)橛行顟B(tài)的進(jìn)程數(shù)量是小于等于消息發(fā)送進(jìn)程的數(shù)量的,所以,K為大于I但小于等于N的整數(shù)。步驟220,從所述K個(gè)消息發(fā)送進(jìn)程中,確定一個(gè)消息發(fā)送進(jìn)程作為主消息發(fā)送進(jìn)程;在具體的實(shí)施過程中,可首先檢查K個(gè)消息發(fā)送該進(jìn)程中每個(gè)消息發(fā)送進(jìn)程是否注冊(cè),對(duì)于在所述K個(gè)消息發(fā)送該進(jìn)程中已經(jīng)注冊(cè)的消息發(fā)送進(jìn)程,通過心跳線程判斷所述已經(jīng)注冊(cè)的消息發(fā)送進(jìn)程中每個(gè)消息發(fā)送進(jìn)程的狀態(tài)是暫停還是有效;對(duì)于所述已經(jīng)注冊(cè)的消息發(fā)送進(jìn)程中狀態(tài)為暫停的消息發(fā)送進(jìn)程,更新消息發(fā)送狀態(tài)為有效;對(duì)于在所述K個(gè)消息發(fā)送進(jìn)程中未注冊(cè)的消息發(fā)送進(jìn)程,先注冊(cè)所述未注冊(cè)的消息發(fā)送進(jìn)程中每個(gè)消息發(fā)送進(jìn)程,然后通過心跳線程判斷注冊(cè)的消息發(fā)送進(jìn)程的狀態(tài)是暫停還是有效狀態(tài);對(duì)于已經(jīng)注冊(cè)的消息發(fā)送進(jìn)程中狀態(tài)為暫停的消息發(fā)送進(jìn)程,更新狀態(tài)為有效;最后通過檢查,從所述K個(gè)消息發(fā)送進(jìn)程中確定一個(gè)狀態(tài)為有效的消息發(fā)送進(jìn)程為主消息發(fā)送進(jìn)程。由于每個(gè)消息發(fā)送進(jìn)程都具有一個(gè)唯一的數(shù)字ID,因此,可將進(jìn)程ID最小的且沒有停止的任務(wù)確定為主任務(wù)。步驟230,通過所述主消息發(fā)送進(jìn)程啟動(dòng)所述主消息發(fā)送進(jìn)程所在消息任務(wù)服務(wù)器中的消息調(diào)度器;步驟240,通過所述消息調(diào)度器,從所述數(shù)據(jù)庫(kù)的消息隊(duì)列中獲得至少一個(gè)沒有進(jìn)程歸屬的待發(fā)送消息;在具體的實(shí)施過程中,通過步驟230啟動(dòng)的所述消息調(diào)度器,從所述數(shù)據(jù)庫(kù)的消息隊(duì)列中,按照消息隊(duì)列的順序獲得至少一個(gè)沒有進(jìn)程歸屬的待發(fā)送消息。需要說明的是,所述至少一個(gè)沒有進(jìn)程歸屬的待發(fā)送消息可包括以下兩種:一種是來自應(yīng)用服務(wù)器新產(chǎn)生的待發(fā)送消息;另一種是歸屬于心跳停止的消息發(fā)送進(jìn)程的待發(fā)送消息。步驟250,從所述K個(gè)消息發(fā)送進(jìn)程中,為所述沒有進(jìn)程歸屬的待發(fā)送消息分配一個(gè)消息發(fā)送進(jìn)程;為了更好的說明分配消息發(fā)送進(jìn)程的過程,將步驟250進(jìn)行拆分,并結(jié)合附圖3,詳細(xì)說明分配消息發(fā)送進(jìn)程的過程。在具體的實(shí)施過程中,分配消息發(fā)送進(jìn)程包括以下步驟:步驟300,計(jì)算有效的消息發(fā)送進(jìn)程的數(shù)量;在具體的實(shí)施過程中,從所述K個(gè)消息發(fā)送進(jìn)程中,獲取至少一個(gè)狀態(tài)為有效的消息發(fā)送進(jìn)程,將所述至少一個(gè)狀態(tài)為有效的消息發(fā)送進(jìn)程的ID以數(shù)組的形式保存在所述消息任務(wù)服務(wù)器中,并根據(jù)數(shù)組中的內(nèi)容,計(jì)算狀態(tài)為有效的消息發(fā)送進(jìn)程的數(shù)量,其中所述數(shù)組可以是在消息任務(wù)服務(wù)器中的內(nèi)存中存放的臨時(shí)數(shù)組,也可以是存放在數(shù)據(jù)庫(kù)中的一個(gè)存儲(chǔ)空間,本領(lǐng)域所屬的技術(shù)人員可以根據(jù)實(shí)際的情況具體設(shè)定。步驟310,計(jì)算取模結(jié)果;在具體的實(shí)施過程中,將所述沒有消息發(fā)送進(jìn)程歸屬的的待發(fā)送消息,按照數(shù)組中的ID編號(hào)和所述待發(fā)送消息進(jìn)程的數(shù)量進(jìn)行取模,獲得取模結(jié)果。步驟320,根據(jù)所述取模結(jié)果,為沒有進(jìn)程歸屬的待發(fā)送消息分配消息發(fā)送進(jìn)程ID ;在具體的實(shí)施過程中,根據(jù)所述取模結(jié)果,為每個(gè)狀態(tài)為有效的發(fā)送進(jìn)程分配一個(gè)還沒有進(jìn)程歸屬的待發(fā)送消息ID。在步驟320步驟,根據(jù)所述取模結(jié)果,為沒有進(jìn)程歸屬的待發(fā)送消息分配消息發(fā)送進(jìn)程ID之后,將所述沒有消息發(fā)送進(jìn)程歸屬的待發(fā)送消息的ID對(duì)應(yīng)的待發(fā)送消息分配給對(duì)應(yīng)的狀態(tài)為有效的消息發(fā)送進(jìn)程。另外,對(duì)于有些心跳停止的消息發(fā)送進(jìn)程,還需進(jìn)行進(jìn)一步的處理。比如對(duì)于心跳停止的消息發(fā)送進(jìn)程進(jìn)行后續(xù)的處理,下面將繼續(xù)描述后續(xù)心跳停止的消息發(fā)送進(jìn)程的處理過程;
在所述從所述K個(gè)消息發(fā)送進(jìn)程中,為所述至少一個(gè)沒有進(jìn)程歸屬的待發(fā)送消息中每個(gè)待發(fā)送消息分配一個(gè)消息發(fā)送進(jìn)程之后,還包括:根據(jù)每個(gè)消息發(fā)送進(jìn)程的心跳,確定是否有心跳停止的消息發(fā)送進(jìn)程;在具體的實(shí)施過程中,心跳是用來檢查進(jìn)程是否為有效狀態(tài)的一種進(jìn)程,當(dāng)被檢測(cè)的進(jìn)程停止時(shí),心跳進(jìn)程就會(huì)得到進(jìn)程停止的通知。基于此心跳,就可以確定是否有心跳停止的消息發(fā)送進(jìn)程。在有一個(gè)或多個(gè)心跳停止的消息發(fā)送進(jìn)程時(shí),為心跳停止的消息發(fā)送進(jìn)程加鎖,減少了消息調(diào)度時(shí)產(chǎn)生的鎖競(jìng)爭(zhēng)。另外,此處具體的加鎖可以采用數(shù)據(jù)庫(kù)的鎖機(jī)制。由于分布式系統(tǒng)中,進(jìn)程的心跳狀態(tài)可能會(huì)由停止變?yōu)橛行?,比如系統(tǒng)的cpu由繁忙狀態(tài)變?yōu)榭臻e狀態(tài),或者進(jìn)程到達(dá)了可以執(zhí)行的時(shí)間段時(shí),所述停止的進(jìn)程就會(huì)恢復(fù)成有效的狀態(tài),進(jìn)而所述消息任務(wù)服務(wù)器會(huì)對(duì)后續(xù)恢復(fù)后可能啟動(dòng)的進(jìn)程還將進(jìn)行進(jìn)一步的處理。由于在多進(jìn)程并發(fā)的機(jī)制下,所述心跳停止的消息發(fā)送進(jìn)程可以重新啟動(dòng)成為有效的進(jìn)程,因此,需要判斷所述心跳停止的消息發(fā)送進(jìn)程中是否有消息發(fā)送進(jìn)程已經(jīng)啟動(dòng)成為狀態(tài)為有效的消息發(fā)送進(jìn)程;在所述心跳停止的消息發(fā)送進(jìn)程中有已經(jīng)啟動(dòng)成為狀態(tài)為有效的消息發(fā)送進(jìn)程時(shí),為所述已經(jīng)啟動(dòng)成為狀態(tài)為有效的消息發(fā)送進(jìn)程解鎖;在所述心跳停止的消息發(fā)送進(jìn)程中沒有已經(jīng)啟動(dòng)成為狀態(tài)為有效的消息發(fā)送進(jìn)程時(shí),將獲得所述沒有啟動(dòng)成為狀態(tài)為有效的消息發(fā)送進(jìn)程中的待發(fā)送消息,并將獲得的待發(fā)送消息重新分配一個(gè)消息狀態(tài)為有效的消息發(fā)送進(jìn)程。在上述過程中,對(duì)進(jìn)程的加鎖與解鎖可以采用數(shù)據(jù)庫(kù)的鎖機(jī)制即,select forupdate實(shí)現(xiàn),其他相同或相似加解鎖方式亦屬于本申請(qǐng)所保護(hù)的范圍。在完成將待發(fā)送消息分配給消息發(fā)送進(jìn)程后,進(jìn)一步的,執(zhí)行消息發(fā)送進(jìn)程。具體來說,通過所述K個(gè)消息發(fā)送進(jìn)程發(fā)送所述至少一個(gè)沒有進(jìn)程歸屬的待發(fā)送消息;所述參數(shù)K僅作為一個(gè)具體的實(shí)例來表示在具體的實(shí)施過程中存在的消息發(fā)送進(jìn)程數(shù)量,進(jìn)一步地,結(jié)合附圖4,詳細(xì)說明發(fā)送待發(fā)送消息的過程。通過所述K個(gè)消息發(fā)送進(jìn)程發(fā)送所述至少一個(gè)沒有進(jìn)程歸屬的待發(fā)送消息包括以下步驟:步驟400,根據(jù)消息計(jì)劃發(fā)送時(shí)間獲取所屬的消息;在具體的實(shí)施過程中,由于每個(gè)消息發(fā)送進(jìn)程在存放在數(shù)據(jù)庫(kù)的時(shí)候,都會(huì)存在一個(gè)計(jì)劃的發(fā)送時(shí)間,基于此計(jì)劃發(fā)送時(shí)間,當(dāng)?shù)竭_(dá)發(fā)送時(shí)間后,消息發(fā)送進(jìn)程就將獲得K個(gè)消息發(fā)送進(jìn)程中每個(gè)有效消息發(fā)送進(jìn)程的沒有消息發(fā)送進(jìn)程歸屬的待發(fā)送消息,具體的消息發(fā)送進(jìn)程獲得待發(fā)送消息的過程請(qǐng)參考圖5中描述的方式;步驟410,更新消息狀態(tài)為發(fā)送中,并更新發(fā)送開始時(shí)間;在具體的實(shí)施過程中,對(duì)于所述一個(gè)或多個(gè)沒有消息發(fā)送進(jìn)程歸屬的待發(fā)送消息中每個(gè)待發(fā)送消息,更新消息狀態(tài)為發(fā)送中,更新發(fā)送開始時(shí)間;步驟420,提交到發(fā)送隊(duì)列;在具體的實(shí)施過程中,提交每個(gè)待發(fā)送消息到發(fā)送隊(duì)列,其中所述發(fā)送隊(duì)列是由消息發(fā)送進(jìn)程構(gòu)按時(shí)間的先后順序進(jìn)行排列的一個(gè)順序列;
步驟430,更新消息狀態(tài)為發(fā)送成功,更新發(fā)送結(jié)束時(shí)間;在具體的實(shí)施過程中,發(fā)送所述每個(gè)待發(fā)送消息,并在發(fā)送成功后,更新消息狀態(tài)為發(fā)送成功,更新發(fā)送結(jié)束時(shí)間。為了使審查員更好的理解本申請(qǐng),下面將結(jié)合附圖5,舉例說明待發(fā)送消息的分配及發(fā)送過程。因?yàn)樵诜植际较到y(tǒng)中,待發(fā)送的消息ID是數(shù)據(jù)的一個(gè)自增長(zhǎng)序列,每新增一條待發(fā)送消息,應(yīng)用服務(wù)器收到發(fā)送者的消息后,將消息插入數(shù)據(jù)庫(kù)其序列值就增加1,同樣,進(jìn)程的ID也是第一次啟動(dòng)時(shí),往數(shù)據(jù)庫(kù)插入的一條進(jìn)程記錄,同樣也是自增長(zhǎng)序列,序列從I開始,每新增一個(gè)進(jìn)程,序列值增加I。請(qǐng)參考圖5,將所有待發(fā)送的消息和可用的進(jìn)程進(jìn)行編號(hào),例如總共有7個(gè)待發(fā)送消息,4個(gè)進(jìn)程,將所述7個(gè)進(jìn)程和所述4個(gè)進(jìn)程按照從小到大的順序排列,下面即以待發(fā)送消息的編號(hào)分別為1001、1002、1003、...、1007,4個(gè)進(jìn)程編號(hào)為進(jìn)程O、1、2、3作為示例,詳細(xì)描述消息和進(jìn)程之間的分配過程。在具體的實(shí)施過程中,待發(fā)送消息的編號(hào)和消息發(fā)送進(jìn)程的編號(hào)在創(chuàng)建的時(shí)候都已經(jīng)分配好了,此處的編號(hào)僅作為一個(gè)具體的實(shí)例以供參考。將待發(fā)送消息的ID和進(jìn)程數(shù)量進(jìn)行取模,獲得取模結(jié)果;如消息1001對(duì)4取模得1,1002對(duì)4取模得2,則消息1003到1007分別獲得的結(jié)果分別為3、0、1、2、3 ;基于所述取模結(jié)果,將每個(gè)消息分配到對(duì)應(yīng)數(shù)組下標(biāo)的進(jìn)程;將消息1001和1005分配給進(jìn)程I ;將消息1002和1006分配給進(jìn)程2 ;將消息1003和1007分配給進(jìn)程3 ;將消息1004分配給進(jìn)程0 ;上述分配好的消息正在發(fā)送中,若某進(jìn)程突然停止了,比如進(jìn)程I停止了,此時(shí),可依照上述方式,根據(jù)數(shù)組下標(biāo)重新分配沒有消息發(fā)送進(jìn)程歸屬的待發(fā)送消息;對(duì)于消息發(fā)送進(jìn)程I中的待發(fā)送消息,也可依照上述方式分配給其他消息發(fā)送進(jìn)程。例如,針對(duì)待發(fā)送消息的編號(hào)分別為1001、1002、1003.....1007,各個(gè)消息編號(hào)分
別對(duì)當(dāng)前消息發(fā)送進(jìn)程數(shù)量3取模后,重新分配如下:將消息1001、1003、1007分配給進(jìn)程3 ;將消息1002和1006分配給進(jìn)程2 ;將消息1004和1005分配給進(jìn)程O。也可以只是將當(dāng)前停止的消息發(fā)送進(jìn)程I中的待發(fā)關(guān)的消息1001和1005重新分配,如,依據(jù)消息1001和1005的消息編號(hào)分別對(duì)當(dāng)前消息發(fā)送進(jìn)程數(shù)量3取模后,分別分配給消息發(fā)送進(jìn)程3和消息發(fā)送進(jìn)程O。以上步驟為本申請(qǐng)中,消息發(fā)送的過程,為了使審查員更好的理解本申請(qǐng),下面將從進(jìn)程的角度,詳細(xì)說明進(jìn)程發(fā)送的過程。請(qǐng)參考圖6,為本申請(qǐng)實(shí)施例中消息發(fā)送進(jìn)程的總體流程圖;步驟600,檢查消息發(fā)送進(jìn)程是否注冊(cè);在具體的實(shí)施過程中,系統(tǒng)開始運(yùn)行后,因?yàn)樗鱿l(fā)送進(jìn)程在創(chuàng)建時(shí),是由多個(gè)消息應(yīng)用服務(wù)器產(chǎn)生的,而在產(chǎn)生的這些進(jìn)程之后,就需要檢測(cè)這些新創(chuàng)建的進(jìn)程是否是注冊(cè)的進(jìn)程,即驗(yàn)證這些進(jìn)程是否為合法的進(jìn)程。首先檢查消息發(fā)送進(jìn)程是否注冊(cè),從數(shù)據(jù)庫(kù)中篩選出注冊(cè)的消息發(fā)送進(jìn)程,若發(fā)現(xiàn)沒有注冊(cè)的消息發(fā)送進(jìn)程,進(jìn)行步驟611,將所述沒有注冊(cè)的消息發(fā)送進(jìn)程注冊(cè),同時(shí)對(duì)于已經(jīng)注冊(cè)的消息發(fā)送進(jìn)程,進(jìn)行步驟610 ;步驟610,啟動(dòng)心跳線程;在具體的實(shí)施過程中,心跳線程會(huì)每隔一段時(shí)間更新消息發(fā)送進(jìn)程的更新時(shí)間,同時(shí)在心跳啟動(dòng)后,心跳線程會(huì)隨著消息發(fā)送進(jìn)程的運(yùn)行而一直運(yùn)行,隨著消息發(fā)送進(jìn)程的結(jié)束而停止。具體來講,所述每隔一段時(shí)間可以是事先設(shè)定好的時(shí)間,例如,心跳線程通過每30秒更新一次消息發(fā)送進(jìn)程的更新時(shí)間來保持消息發(fā)送進(jìn)程心跳,需要注意的是,此處所采用的30秒僅僅是本申請(qǐng)實(shí)施例中的一種方式,本領(lǐng)域所屬的技術(shù)人員可以根據(jù)實(shí)際情況采用其他的間隔時(shí)間,如15秒、20秒等等,其相同或相類似的間隔時(shí)間均落入本申請(qǐng)的保護(hù)范圍之內(nèi)。步驟620,檢測(cè)消息發(fā)送進(jìn)程的狀態(tài);在具體的實(shí)施過程中,基于所述步驟620的心跳線程,檢測(cè)每個(gè)消息發(fā)送進(jìn)程的狀態(tài),若發(fā)現(xiàn)消息發(fā)送進(jìn)程狀態(tài)為暫停,進(jìn)行步驟631,將所述暫停的消息發(fā)送進(jìn)程的狀態(tài)更新為有效。步驟630,檢查是否是主消息發(fā)送進(jìn)程;在具體的實(shí)施過程中,若當(dāng)前消息發(fā)送進(jìn)程不是主消息發(fā)送進(jìn)程,則直接進(jìn)行步驟640,啟動(dòng)任務(wù)發(fā)送器,否則進(jìn)行步驟641,啟動(dòng)消息調(diào)度器。步驟641,啟動(dòng)消息調(diào)度器;在具體的實(shí)施過程中,啟動(dòng)消息調(diào)度器首先確定是否有心跳停止的消息發(fā)送進(jìn)程;在有心跳停止的消息發(fā)送進(jìn)程時(shí),為所述心跳停止消息發(fā)送進(jìn)程中每個(gè)心跳停止的消息發(fā)送進(jìn)程加鎖。同時(shí),判斷所述心跳停止的消息發(fā)送進(jìn)程中是否有啟動(dòng)成為狀態(tài)為有效的消息發(fā)送進(jìn)程;在所述心跳停止的消息發(fā)送進(jìn)程中有已經(jīng)啟動(dòng)成為狀態(tài)為有效的進(jìn)程時(shí),為所述狀態(tài)為有效的消息發(fā)送進(jìn)程解鎖;在所述心跳停止的消息發(fā)送進(jìn)程中沒有啟動(dòng)成為狀態(tài)為有效的進(jìn)程時(shí),獲得所述沒有成為狀態(tài)為有效的消息發(fā)送進(jìn)程中的待發(fā)送消息;并將這些待發(fā)送消息重新分配一個(gè)狀態(tài)為有效的消息發(fā)送進(jìn)程;同時(shí),為所述沒有啟動(dòng)成為狀態(tài)為有效的消息發(fā)送進(jìn)程解鎖。步驟640,啟動(dòng)任務(wù)發(fā)送器;在具體的實(shí)施過程中,執(zhí)行消息發(fā)送進(jìn)程即是發(fā)送待發(fā)送消息,同前述步驟240的過程一樣,詳細(xì)過程此處就不在贅述。另外,執(zhí)行消息發(fā)送進(jìn)程后,還需要將非主消息發(fā)送進(jìn)程中的消息和經(jīng)重新分配后的待發(fā)送消息發(fā)送。以上過程為從進(jìn)程的角度說明進(jìn)程的總體流程,對(duì)于其主消息發(fā)送進(jìn)程的消息調(diào)度情況,下面將詳細(xì)說明。下面請(qǐng)參考圖7,為本申請(qǐng)實(shí)施例中主消息發(fā)送進(jìn)程的消息調(diào)度的流程步驟700,查詢所有有效的消息發(fā)送進(jìn)程,并檢查是否有心跳停止的進(jìn)程;在具體的實(shí)施過程中,從消息發(fā)送進(jìn)程隊(duì)列中查詢所有有效的消息發(fā)送進(jìn)程,并檢查是否有心跳停止的消息發(fā)送進(jìn)程,其中,對(duì)于有效的消息發(fā)送進(jìn)程,進(jìn)行步驟701,否則進(jìn)行步驟710。步驟701,更新心跳停止的消息發(fā)送進(jìn)程為暫停狀態(tài);在具體的實(shí)施過程中,由于有效的消息發(fā)送進(jìn)程可能包括心跳活躍和心跳停止消息發(fā)送進(jìn)程,故此步驟是將心跳停止的進(jìn)程標(biāo)記為暫停狀態(tài),以便下次查詢就不再查詢到當(dāng)前消息發(fā)送進(jìn)程,并且將所屬此暫停狀態(tài)進(jìn)程的消息也查出來,方便了后續(xù)步驟的進(jìn)行是否需要重新給這些消息重新分配新的有效進(jìn)程。所述更新心跳停止的消息發(fā)送進(jìn)程為暫停狀態(tài)具體包括:在完成步驟701之后,進(jìn)行步驟711。步驟710,查詢沒有消息發(fā)送進(jìn)程歸屬的待發(fā)送消息;在具體的實(shí)施過程中,查詢沒有消息發(fā)送進(jìn)程歸屬的待發(fā)送消息具體包括兩種:一種是來自應(yīng)用服務(wù)器新產(chǎn)生的待發(fā)送消息;另一種為來自步驟711的待發(fā)送消息。步驟711,查詢暫停的消息發(fā)送進(jìn)程所屬的消息;在具體的實(shí)施過程中,因該消息發(fā)送進(jìn)程狀態(tài)為暫停,故查詢所述消息發(fā)送進(jìn)程攜帶的消息,并將所述消息歸入沒有消息發(fā)送進(jìn)程歸屬的待發(fā)送消息之中;獲得了來自步驟711的待發(fā)送消息與應(yīng)用服務(wù)器新產(chǎn)生的待發(fā)送消息后,進(jìn)行步驟 720。步驟720,重新對(duì)消息分配消息分配進(jìn)程;在具體的實(shí)施過程中,上述過程與步驟250 —致,此處不再贅述。步驟730,檢測(cè)是否有心跳;通過心跳線程,檢測(cè)每個(gè)消息發(fā)送進(jìn)程的心跳狀態(tài)。對(duì)于有心跳的消息發(fā)送進(jìn)程,進(jìn)行步驟740,同時(shí)對(duì)于心跳停止的消息發(fā)送進(jìn)程,進(jìn)行步驟731。步驟731,查詢心跳停止的消息發(fā)送進(jìn)程的狀態(tài),并加鎖;基于步驟730對(duì)每個(gè)消息發(fā)送進(jìn)程的心跳檢測(cè),確定是否有心跳停止的消息發(fā)送進(jìn)程;在有一個(gè)或多個(gè)心跳停止的消息發(fā)送進(jìn)程時(shí),為所述一個(gè)或多個(gè)心跳停止消息發(fā)送進(jìn)程中每個(gè)心跳停止的消息發(fā)送進(jìn)程加鎖。步驟740,更新消息所屬消息發(fā)送進(jìn)程;根據(jù)消息調(diào)度,更新消息所屬的消息發(fā)送進(jìn)程,其中,所述消息調(diào)度過程與步驟250分配消息發(fā)送進(jìn)程的過程一致,此處不再贅述步驟741,判斷是否啟動(dòng);在具體的實(shí)施過程中,在有一個(gè)或多個(gè)心跳停止消息發(fā)送進(jìn)程時(shí),為所述一個(gè)或多個(gè)心跳停止消息發(fā)送進(jìn)程中每個(gè)心跳停止的消息發(fā)送進(jìn)程加鎖之后,還包括:判斷所述一個(gè)或多個(gè)心跳停止的消息發(fā)送進(jìn)程中是否有消息發(fā)送進(jìn)程已經(jīng)啟動(dòng)成為狀態(tài)為有效的消息發(fā)送進(jìn)程;
若后續(xù)啟動(dòng)了該消息發(fā)送進(jìn)程,則進(jìn)行步驟742,否則進(jìn)行750 ;步驟742,只更新待發(fā)送消息的所屬消息發(fā)送進(jìn)程,釋放鎖;在具體的實(shí)施過程中,在所述一個(gè)或多個(gè)心跳停止的消息發(fā)送進(jìn)程中有已經(jīng)啟動(dòng)成為狀態(tài)為有效的消息發(fā)送進(jìn)程時(shí),為所述已經(jīng)啟動(dòng)成為狀態(tài)為有效的消息發(fā)送進(jìn)程解鎖;同時(shí)僅僅只更新新待發(fā)送消息所屬消息發(fā)送進(jìn)程。步驟750,更新消息所屬消息發(fā)送進(jìn)程,釋放鎖;在具體的實(shí)施過程中,啟動(dòng)所述消息發(fā)送進(jìn)程時(shí),為所述已經(jīng)啟動(dòng)成為狀態(tài)為有效的消息發(fā)送進(jìn)程解鎖;在所述一個(gè)或多個(gè)心跳停止的消息發(fā)送進(jìn)程中沒有已經(jīng)啟動(dòng)成為狀態(tài)為有效的消息發(fā)送進(jìn)程時(shí),獲得所述沒有啟動(dòng)成為狀態(tài)為有效的消息發(fā)送進(jìn)程中的待發(fā)送消息;給所述沒有啟動(dòng)成為狀態(tài)為有效的消息發(fā)送進(jìn)程的待發(fā)送消息中每個(gè)待發(fā)送消息分配一個(gè)狀態(tài)為有效的消息發(fā)送進(jìn)程;為所述沒有啟動(dòng)成為狀態(tài)為有效的消息發(fā)送進(jìn)程解鎖。在完成步驟750和步驟742之后,進(jìn)行步驟760。步驟760,發(fā)送待發(fā)送消息;在具體的實(shí)施過程中,發(fā)送待發(fā)送消息過程同步驟260 —致,此處不再贅述。下面將對(duì)本申請(qǐng)實(shí)施例中,消息任務(wù)服務(wù)器內(nèi)部具體的功能結(jié)構(gòu)做具體描述。請(qǐng)參考圖8,為本申請(qǐng)實(shí)施例中發(fā)送消息系統(tǒng)的功能模塊圖;如圖所示的發(fā)送消息的系統(tǒng),包括:應(yīng)用服務(wù)器,數(shù)據(jù)庫(kù)和消息任務(wù)服務(wù)器,所述應(yīng)用服務(wù)器與至少一個(gè)發(fā)送端連接,用于接收和創(chuàng)建待發(fā)送消息,所述數(shù)據(jù)庫(kù)與所述應(yīng)用服務(wù)器連接,用于存放所述應(yīng)用服務(wù)器接收和創(chuàng)建的待發(fā)送消息,并將所述待發(fā)送消息以消息隊(duì)列的形式保存,所述消息任務(wù)服務(wù)器與所述數(shù)據(jù)連接,用于存放所述消息任務(wù)服務(wù)器中創(chuàng)建的消息發(fā)送進(jìn)程,在這些消息發(fā)送進(jìn)程中,包括一個(gè)主消息發(fā)送進(jìn)程,用于對(duì)所述消息發(fā)送進(jìn)程和所述待發(fā)送消息進(jìn)行調(diào)度。其中,所述主消息發(fā)送進(jìn)程對(duì)應(yīng)的消息任務(wù)服務(wù)器用于:通過所述主消息發(fā)送進(jìn)程啟動(dòng)所述主消息發(fā)送進(jìn)程所在消息任務(wù)服務(wù)器中的消息調(diào)度器;通過所述消息調(diào)度器,從所述數(shù)據(jù)庫(kù)的消息隊(duì)列中獲得至少一個(gè)沒有進(jìn)程歸屬的待發(fā)送消息;從所述K個(gè)消息發(fā)送進(jìn)程中,為所述至少一個(gè)沒有進(jìn)程歸屬的待發(fā)送消息中每個(gè)待發(fā)送消息分配一個(gè)消息發(fā)送進(jìn)程;通過所述K個(gè)消息發(fā)送進(jìn)程發(fā)送所述至少一個(gè)沒有進(jìn)程歸屬的待發(fā)送消息。所述消息任務(wù)服務(wù)器包括:檢測(cè)模塊,用于檢查K個(gè)消息發(fā)送進(jìn)程中每個(gè)消息發(fā)送進(jìn)程是否注冊(cè);判斷模塊,用于對(duì)于在所述K個(gè)消息發(fā)送進(jìn)程中已經(jīng)注冊(cè)的消息發(fā)送進(jìn)程,通過心跳線程判斷所述已經(jīng)注冊(cè)的消息發(fā)送進(jìn)程中每個(gè)消息發(fā)送進(jìn)程的狀態(tài)是暫停還是有效;還用于對(duì)于在所述K個(gè)消息發(fā)送進(jìn)程中未注冊(cè)的消息發(fā)送進(jìn)程,通過心跳線程判斷已經(jīng)注冊(cè)的所述未注冊(cè)的消息發(fā)送進(jìn)程中每個(gè)消息發(fā)送進(jìn)程的狀態(tài)是暫停還是有效狀態(tài);更新模塊,用于對(duì)于所述已經(jīng)注冊(cè)的消息發(fā)送進(jìn)程中狀態(tài)為暫停的消息發(fā)送進(jìn)程,更新消息發(fā)送狀態(tài)為有效,還用于對(duì)于所述已經(jīng)注冊(cè)的所述未注冊(cè)的消息發(fā)送進(jìn)程中狀態(tài)為暫停的消息發(fā)送進(jìn)程,更新狀態(tài)為有效;注冊(cè)模塊,用于對(duì)于在所述K個(gè)消息發(fā)送進(jìn)程中未注冊(cè)的消息發(fā)送進(jìn)程,先注冊(cè)所述未注冊(cè)的消息發(fā)送進(jìn)程中每個(gè)消息發(fā)送進(jìn)程;確定模塊,用于通過檢查,從所述K個(gè)消息發(fā)送進(jìn)程中確定一個(gè)狀態(tài)為有效的消息發(fā)送進(jìn)程為主消息發(fā)送進(jìn)程。在具體的實(shí)施過程中,所述至少一個(gè)沒有進(jìn)程歸屬的待發(fā)送消息,具體包括:新的待發(fā)送消息和/或歸屬于心跳停止的消息發(fā)送進(jìn)程的待發(fā)送消息。所述消息任務(wù)服務(wù)器還包括:心跳確定模塊,用于確定是否有心跳停止的消息發(fā)送進(jìn)程;加鎖模塊,用于在有一個(gè)或多個(gè)心跳停止的消息發(fā)送進(jìn)程時(shí),為所述一個(gè)或多個(gè)心跳停止消息發(fā)送進(jìn)程中每個(gè)心跳停止的消息發(fā)送進(jìn)程加鎖。所述消息任務(wù)服務(wù)器還包括:心跳判斷模塊,用于判斷所述一個(gè)或多個(gè)心跳停止的消息發(fā)送進(jìn)程中是否有消息發(fā)送進(jìn)程已經(jīng)啟動(dòng)成為狀態(tài)為有效的消息發(fā)送進(jìn)程;獲得模塊,用于在所述一個(gè)或多個(gè)心跳停止消息發(fā)送進(jìn)程中沒有已經(jīng)啟動(dòng)成為有效消息發(fā)送進(jìn)程時(shí),獲得所述沒有啟動(dòng)成為有效消息發(fā)送進(jìn)程的歸屬于心跳停止消息發(fā)送進(jìn)程的待發(fā)送消息;解鎖模塊,用于在所述一個(gè)或多個(gè)心跳停止消息發(fā)送進(jìn)程中有已經(jīng)啟動(dòng)成為有效消息發(fā)送進(jìn)程的消息發(fā)送進(jìn)程時(shí),為所述已經(jīng)啟動(dòng)成為有效消息發(fā)送進(jìn)程的消息發(fā)送進(jìn)程解鎖,還用于為所述沒有啟動(dòng)成為有效消息發(fā)送進(jìn)程的消息發(fā)送進(jìn)程解鎖;進(jìn)程分配模塊,用于給所述沒有啟動(dòng)成為有效消息發(fā)送進(jìn)程的消息發(fā)送進(jìn)程的歸屬于心跳停止消息發(fā)送進(jìn)程的待發(fā)送消息中,每個(gè)待發(fā)送消息分配一個(gè)有效消息發(fā)送進(jìn)程。所述消息任務(wù)服務(wù)器還包括:消息調(diào)度器,用于從所述K個(gè)消息發(fā)送進(jìn)程中,獲取至少一個(gè)狀態(tài)為有效的消息發(fā)送進(jìn)程,將所述至少一個(gè)狀態(tài)為有效的消息發(fā)送進(jìn)程中每個(gè)消息發(fā)送進(jìn)程的ID保存在數(shù)組中,并計(jì)算所述至少一個(gè)狀態(tài)為有效的消息發(fā)送進(jìn)程的數(shù)量;將所述至少一個(gè)沒有消息發(fā)送進(jìn)程歸屬的待發(fā)送消息中每個(gè)沒有消息發(fā)送進(jìn)程歸屬的待發(fā)送消息的ID和所述數(shù)量進(jìn)行取模,獲得取模結(jié)果;根據(jù)所述取模結(jié)果,獲得所述至少一個(gè)狀態(tài)為有效的消息發(fā)送進(jìn)程中一個(gè)或多個(gè)狀態(tài)為有效的消息發(fā)送進(jìn)程中每個(gè)狀態(tài)為有效的消息發(fā)送進(jìn)程分配到的一個(gè)或多個(gè)沒有消息發(fā)送進(jìn)程歸屬的待發(fā)送消息的ID ;將所述一個(gè)或多個(gè)沒有消息發(fā)送進(jìn)程歸屬的待發(fā)送消息的ID對(duì)應(yīng)的待發(fā)送消息分配給對(duì)應(yīng)的狀態(tài)為有效的消息發(fā)送進(jìn)程。所述消息任務(wù)服務(wù)器器具體包括:消息發(fā)送器,用于基于消息計(jì)劃發(fā)送時(shí)間,獲得K個(gè)消息發(fā)送進(jìn)程中每個(gè)有效消息發(fā)送進(jìn)程的一個(gè)或多個(gè)沒有消息發(fā)送進(jìn)程歸屬的待發(fā)送消息;對(duì)于所述一個(gè)或多個(gè)沒有消息發(fā)送進(jìn)程歸屬的待發(fā)送消息中每個(gè)待發(fā)送消息,更新消息狀態(tài)為發(fā)送中,更新發(fā)送開始時(shí)間;提交每個(gè)待發(fā)送消息到發(fā)送隊(duì)列;發(fā)送所述每個(gè)待發(fā)送消息,并在發(fā)送成功后,更新消息狀態(tài)為發(fā)送成功,更新發(fā)送結(jié)束時(shí)間。通過本申請(qǐng)上述的一個(gè)或多個(gè)實(shí)施例,可以實(shí)現(xiàn)如下技術(shù)效果:一、通過采用在消息調(diào)度器中調(diào)度處理發(fā)送消息,解決了現(xiàn)有技術(shù)中因消息間競(jìng)爭(zhēng)而容易造成的死鎖的技術(shù)問題,從而達(dá)到了降低消息發(fā)送進(jìn)程競(jìng)爭(zhēng)造成死鎖的技術(shù)問題。二、由于在消息分發(fā)的過程中采用了心跳檢測(cè)的技術(shù)手段,解決了消息發(fā)送過程中,檢測(cè)各個(gè)消息發(fā)送進(jìn)程的有效性,從而達(dá)到了及時(shí)更新消息發(fā)送進(jìn)程狀態(tài)的技術(shù)效果。三、通過采用消息調(diào)度器中的消息重分配方法,解決了未發(fā)送完成的消息等待處理的技術(shù)問題,達(dá)到了智能的將未發(fā)送完成的消息轉(zhuǎn)移到可用的消息發(fā)送進(jìn)程上。盡管已描述了本申請(qǐng)的優(yōu)選實(shí)施例,但本領(lǐng)域內(nèi)的技術(shù)人員一旦得知了基本創(chuàng)造性概念,則可對(duì)這些實(shí)施例作出另外的變更和修改。所以,所附權(quán)利要求意欲解釋為包括優(yōu)選實(shí)施例以及落入本申請(qǐng)范圍的所有變更和修改。顯然,本領(lǐng)域的技術(shù)人員可以對(duì)本申請(qǐng)進(jìn)行各種改動(dòng)和變型而不脫離本發(fā)明的精神和范圍。這樣,倘若本申請(qǐng)的這些修改和變型屬于本申請(qǐng)權(quán)利要求及其等同技術(shù)的范圍之內(nèi),則本申請(qǐng)也意圖包含這些改動(dòng)和變型在內(nèi)。
權(quán)利要求
1.一種發(fā)送消息的方法,其特征在于,應(yīng)用在包括有數(shù)據(jù)庫(kù),與所述數(shù)據(jù)庫(kù)連接的M個(gè)應(yīng)用服務(wù)器和與所述數(shù)據(jù)庫(kù)連接的至少N個(gè)消息任務(wù)服務(wù)器的系統(tǒng)中,其中,所述N個(gè)消息任務(wù)服務(wù)器中每個(gè)消息任務(wù)服務(wù)器包括有一個(gè)消息發(fā)送進(jìn)程,M為大于或等于I的整數(shù),所述方法包括: 判斷所述N個(gè)消息發(fā)送進(jìn)程中每個(gè)消息發(fā)送進(jìn)程的狀態(tài)是否是有效狀態(tài); 基于所述判斷,從所述N個(gè)消息發(fā)送進(jìn)程中確定K個(gè)消息發(fā)送進(jìn)程的狀為有效狀態(tài),其中,K為大于I但小于等于N的整數(shù); 從所述K個(gè)消息發(fā)送進(jìn)程中,確定一個(gè)消息發(fā)送進(jìn)程作為主消息發(fā)送進(jìn)程; 通過所述主消息發(fā)送進(jìn)程啟動(dòng)所述主消息發(fā)送進(jìn)程所在消息任務(wù)服務(wù)器中的消息調(diào)度器; 通過所述消息調(diào)度器,從所述數(shù)據(jù)庫(kù)的消息隊(duì)列中獲得至少一個(gè)沒有進(jìn)程歸屬的待發(fā)送消息; 從所述K個(gè)消息發(fā)送進(jìn)程中,為所述至少一個(gè)沒有進(jìn)程歸屬的待發(fā)送消息中每個(gè)待發(fā)送消息分配一個(gè)消息發(fā)送進(jìn)程; 通過所述K個(gè)消息發(fā)送進(jìn)程發(fā)送所述至少一個(gè)沒有進(jìn)程歸屬的待發(fā)送消息。
2.如權(quán)利要求1所述的方法,其特征在于,所述從所述K個(gè)消息發(fā)送進(jìn)程中,確定一個(gè)消息發(fā)送進(jìn)程作為主消息發(fā)送進(jìn)程,具體包括: 檢查K個(gè)消息發(fā)送進(jìn)程中每個(gè)消息發(fā)送進(jìn)程是否注冊(cè); 對(duì)于在所述K個(gè)消息發(fā)送進(jìn)程中已經(jīng)注冊(cè)的消息發(fā)送進(jìn)程,通過心跳線程判斷所述已經(jīng)注冊(cè)的消息發(fā)送進(jìn)程中每個(gè)消息發(fā)送進(jìn)程的狀態(tài)是暫停還是有效; 對(duì)于所述已經(jīng)注冊(cè)的消息發(fā)送進(jìn)程中狀態(tài)為暫停的消息發(fā)送進(jìn)程,更新消息發(fā)送狀態(tài)為有效; 對(duì)于在所述K個(gè)消息發(fā)送進(jìn)程中未注冊(cè)的消息發(fā)送進(jìn)程,先注冊(cè)所述未注冊(cè)的消息發(fā)送進(jìn)程中每個(gè)消息發(fā)送進(jìn)程,然后通過心跳線程判斷已經(jīng)注冊(cè)的所述未注冊(cè)的消息發(fā)送進(jìn)程中每個(gè)消息發(fā)送進(jìn)程的狀態(tài)是暫停還是有效狀態(tài);對(duì)于所述已經(jīng)注冊(cè)的所述未注冊(cè)的消息發(fā)送進(jìn)程中狀態(tài)為暫停的消息發(fā)送進(jìn)程,更新狀態(tài)為有效; 通過檢查,從所述K個(gè)消息發(fā)送進(jìn)程中確定一個(gè)狀態(tài)為有效的消息發(fā)送進(jìn)程為主消息發(fā)送進(jìn)程。
3.如權(quán)利要求1或2所述的方法,其特征在于,所述至少一個(gè)沒有進(jìn)程歸屬的待發(fā)送消息,具體包括:新的待發(fā)送消息和/或歸屬于心跳停止的消息發(fā)送進(jìn)程的待發(fā)送消息。
4.如權(quán)利要求1或2所述的方法,其特征在于,在所述從所述K個(gè)消息發(fā)送進(jìn)程中,為所述至少一個(gè)沒有進(jìn)程歸屬的待發(fā)送消息中每個(gè)待發(fā)送消息分配一個(gè)消息發(fā)送進(jìn)程之后,還包括: 確定是否有心跳停止的消息發(fā)送進(jìn)程; 在有一個(gè)或多個(gè)心跳停止的消息發(fā)送進(jìn)程時(shí),為所述一個(gè)或多個(gè)心跳停止消息發(fā)送進(jìn)程中每個(gè)心跳停止的消息發(fā)送進(jìn)程加鎖。
5.如權(quán)利要求4所述的方法,其特征在于,在有一個(gè)或多個(gè)心跳停止消息發(fā)送進(jìn)程時(shí),為所述一個(gè)或多個(gè)心跳停止消息發(fā)送進(jìn)程中每個(gè)心跳停止的消息發(fā)送進(jìn)程加鎖之后,所述方法還包括:判斷所述一個(gè)或多個(gè)心跳停止的消息發(fā)送進(jìn)程中是否有消息發(fā)送進(jìn)程已經(jīng)啟動(dòng)成為狀態(tài)為有效的消息發(fā)送進(jìn)程; 在所述一個(gè)或多個(gè)心跳停止的消息發(fā)送進(jìn)程中有已經(jīng)啟動(dòng)成為狀態(tài)為有效的消息發(fā)送進(jìn)程時(shí),為所述已經(jīng)啟動(dòng)成為狀態(tài)為有效的消息發(fā)送進(jìn)程解鎖; 在所述一個(gè)或多個(gè)心跳停止的消息發(fā)送進(jìn)程中沒有已經(jīng)啟動(dòng)成為狀態(tài)為有效的消息發(fā)送進(jìn)程時(shí),獲得所述沒有啟動(dòng)成為狀態(tài)為有效的消息發(fā)送進(jìn)程中的待發(fā)送消息; 給所述沒有啟動(dòng)成為狀態(tài)為有效的消息發(fā)送進(jìn)程的待發(fā)送消息中每個(gè)待發(fā)送消息分配一個(gè)狀態(tài)為有效的消息發(fā)送進(jìn)程; 為所述沒有啟動(dòng)成為狀態(tài)為有效的消息發(fā)送進(jìn)程解鎖。
6.如權(quán)利要求1所述的方法,其特征在于,從所述K個(gè)消息發(fā)送進(jìn)程中,為所述至少一個(gè)沒有進(jìn)程歸屬的待發(fā)送消息中每個(gè)待發(fā)送消息分配一個(gè)消息發(fā)送進(jìn)程,具體包括: 從所述K個(gè)消息發(fā)送進(jìn)程中,獲取至少一個(gè)狀態(tài)為有效的消息發(fā)送進(jìn)程,將所述至少一個(gè)狀態(tài)為有效的消息發(fā)送進(jìn)程中每個(gè)消息發(fā)送進(jìn)程的ID保存在數(shù)組中,并計(jì)算所述至少一個(gè)狀態(tài)為有效的消息發(fā)送進(jìn)程的數(shù)量; 將所述至少一個(gè)沒有消息發(fā)送進(jìn)程歸屬的待發(fā)送消息中每個(gè)沒有消息發(fā)送進(jìn)程歸屬的待發(fā)送消息的ID和所述數(shù)量進(jìn)行取模,獲得取模結(jié)果; 根據(jù)所述取模結(jié)果,獲得所述至少一個(gè)狀態(tài)為有效的消息發(fā)送進(jìn)程中一個(gè)或多個(gè)狀態(tài)為有效的消息發(fā)送進(jìn)程中每個(gè)狀態(tài)為有效的消息發(fā)送進(jìn)程分配到的一個(gè)或多個(gè)沒有消息發(fā)送進(jìn)程歸屬的待發(fā)送消息的ID ; 將所述一個(gè)或多個(gè)沒有消息發(fā)送進(jìn)程歸屬的待發(fā)送消息的ID對(duì)應(yīng)的待發(fā)送消息分配給對(duì)應(yīng)的狀態(tài)為有效的消息發(fā)送進(jìn)程。
7.如權(quán)利要求1所述的方法,其特征在于,所述通過所述K個(gè)消息發(fā)送進(jìn)程發(fā)送所述至少一個(gè)沒有進(jìn)程歸屬的待發(fā)送消息,具體包括: 基于消息計(jì)劃發(fā)送時(shí)間,獲得K個(gè)消息發(fā)送進(jìn)程中每個(gè)有效消息發(fā)送進(jìn)程的一個(gè)或多個(gè)沒有消息發(fā)送進(jìn)程歸屬的待發(fā)送消息; 對(duì)于所述一個(gè)或多個(gè)沒有消息發(fā)送進(jìn)程歸屬的待發(fā)送消息中每個(gè)待發(fā)送消息,更新消息狀態(tài)為發(fā)送中,更新發(fā)送開始時(shí)間; 提交每個(gè)待發(fā)送消息到發(fā)送隊(duì)列; 發(fā)送所述每個(gè)待發(fā)送消息,并在發(fā)送成功后,更新消息狀態(tài)為發(fā)送成功,更新發(fā)送結(jié)束時(shí)間。
8.一種發(fā)送消息的系統(tǒng),其特征在于,包括: M個(gè)應(yīng)用服務(wù)器,與至少一個(gè)發(fā)送端連接,用于接收所述至少一個(gè)發(fā)送端發(fā)送的待發(fā)送消息,其中,所述M個(gè)應(yīng)用服務(wù)器中每個(gè)應(yīng)用服務(wù)器包括一個(gè)消息發(fā)送接口,M為大于或等于I的整數(shù); 數(shù)據(jù)庫(kù),與所述M個(gè)應(yīng)用服務(wù)器連接,用于通過每個(gè)應(yīng)用服務(wù)器的所述消息發(fā)送,接收所述至少一個(gè)待發(fā)送消息,并將所述至少一個(gè)待發(fā)送消息放在一消息隊(duì)列中; N個(gè)消息任務(wù)服務(wù)器,與所述數(shù)據(jù)庫(kù)連接,所述N個(gè)消息任務(wù)服務(wù)器中每個(gè)消息任務(wù)服務(wù)器包括有一個(gè)消息發(fā)送進(jìn)程;其中,所述N個(gè)消息發(fā)送進(jìn)程中有K個(gè)消息發(fā)送進(jìn)程的狀態(tài)為有效狀態(tài),所述K個(gè)消息發(fā)送進(jìn)程中有一個(gè)為主消息發(fā)送進(jìn)程;其中,所述主消息發(fā)送進(jìn)程對(duì)應(yīng)的消息任務(wù)服務(wù)器用于: 通過所述主消息發(fā)送進(jìn)程啟動(dòng)所述主消息發(fā)送進(jìn)程所在消息任務(wù)服務(wù)器中的消息調(diào)度器; 通過所述消息調(diào)度器,從所述數(shù)據(jù)庫(kù)的消息隊(duì)列中獲得至少一個(gè)沒有進(jìn)程歸屬的待發(fā)送消息; 從所述K個(gè)消息發(fā)送進(jìn)程中,為所述至少一個(gè)沒有進(jìn)程歸屬的待發(fā)送消息中每個(gè)待發(fā)送消息分配一個(gè)消息發(fā)送進(jìn)程; 通過所述K個(gè)消息發(fā)送進(jìn)程發(fā)送所述至少一個(gè)沒有進(jìn)程歸屬的待發(fā)送消息。
9.如權(quán)利要求8所述的系統(tǒng),其特征在于,所述消息任務(wù)服務(wù)器包括: 檢測(cè)模塊,用于檢查K個(gè)消息發(fā)送進(jìn)程中每個(gè)消息發(fā)送進(jìn)程是否注冊(cè); 判斷模塊,用于對(duì)于在所述K個(gè)消息發(fā)送進(jìn)程中已經(jīng)注冊(cè)的消息發(fā)送進(jìn)程,通過心跳線程判斷所述已經(jīng)注冊(cè)的消息發(fā)送進(jìn)程中每個(gè)消息發(fā)送進(jìn)程的狀態(tài)是暫停還是有效;還用于對(duì)于在所述K個(gè)消息發(fā)送進(jìn)程中未注冊(cè)的消息發(fā)送進(jìn)程,通過心跳線程判斷已經(jīng)注冊(cè)的所述未注冊(cè)的消息發(fā)送進(jìn)程中每個(gè)消息發(fā)送進(jìn)程的狀態(tài)是暫停還是有效狀態(tài); 更新模塊,用于對(duì)于所 述已經(jīng)注冊(cè)的消息發(fā)送進(jìn)程中狀態(tài)為暫停的消息發(fā)送進(jìn)程,更新消息發(fā)送狀態(tài)為有效,還用于對(duì)于所述已經(jīng)注冊(cè)的所述未注冊(cè)的消息發(fā)送進(jìn)程中狀態(tài)為暫停的消息發(fā)送進(jìn)程,更新狀態(tài)為有效; 注冊(cè)模塊,用于對(duì)于在所述K個(gè)消息發(fā)送進(jìn)程中未注冊(cè)的消息發(fā)送進(jìn)程,先注冊(cè)所述未注冊(cè)的消息發(fā)送進(jìn)程中每個(gè)消息發(fā)送進(jìn)程; 確定模塊,用于通過檢查,從所述K個(gè)消息發(fā)送進(jìn)程中確定一個(gè)狀態(tài)為有效的消息發(fā)送進(jìn)程為主消息發(fā)送進(jìn)程。
10.如權(quán)利要求8所述的系統(tǒng),其特征在于,所述消息任務(wù)服務(wù)器還包括: 消息調(diào)度器,用于從所述K個(gè)消息發(fā)送進(jìn)程中,獲取至少一個(gè)狀態(tài)為有效的消息發(fā)送進(jìn)程,將所述至少一個(gè)狀態(tài)為有效的消息發(fā)送進(jìn)程中每個(gè)消息發(fā)送進(jìn)程的ID保存在數(shù)組中,并計(jì)算所述至少一個(gè)狀態(tài)為有效的消息發(fā)送進(jìn)程的數(shù)量; 將所述至少一個(gè)沒有消息發(fā)送進(jìn)程歸屬的待發(fā)送消息中每個(gè)沒有消息發(fā)送進(jìn)程歸屬的待發(fā)送消息的ID和所述數(shù)量進(jìn)行取模,獲得取模結(jié)果; 根據(jù)所述取模結(jié)果,獲得所述至少一個(gè)狀態(tài)為有效的消息發(fā)送進(jìn)程中一個(gè)或多個(gè)狀態(tài)為有效的消息發(fā)送進(jìn)程中每個(gè)狀態(tài)為有效的消息發(fā)送進(jìn)程分配到的一個(gè)或多個(gè)沒有消息發(fā)送進(jìn)程歸屬的待發(fā)送消息的ID ; 將所述一個(gè)或多個(gè)沒有消息發(fā)送進(jìn)程歸屬的待發(fā)送消息的ID對(duì)應(yīng)的待發(fā)送消息分配給對(duì)應(yīng)的狀態(tài)為有效的消息發(fā)送進(jìn)程。
全文摘要
本申請(qǐng)?zhí)峁┝艘环N發(fā)送消息的方法及其系統(tǒng),包括判斷N個(gè)消息發(fā)送進(jìn)程中每個(gè)消息發(fā)送進(jìn)程的狀態(tài)是否是有效狀態(tài);基于所述判斷,從N個(gè)消息發(fā)送進(jìn)程中確定K個(gè)消息發(fā)送進(jìn)程的狀為有效狀態(tài),其中K為大于1但小于等于N的整數(shù);從K個(gè)消息發(fā)送進(jìn)程中,確定一個(gè)消息發(fā)送進(jìn)程作為主消息發(fā)送進(jìn)程;通過主消息發(fā)送進(jìn)程去啟動(dòng)主消息發(fā)送進(jìn)程所在消息任務(wù)服務(wù)器中的消息調(diào)度器;通過消息調(diào)度器,從數(shù)據(jù)庫(kù)的消息隊(duì)列中獲得至少一個(gè)沒有進(jìn)程歸屬的待發(fā)送消息;從K個(gè)消息發(fā)送進(jìn)程中,為至少一個(gè)沒有進(jìn)程歸屬的待發(fā)送消息中每個(gè)待發(fā)送消息分配一個(gè)消息發(fā)送進(jìn)程;通過K個(gè)消息發(fā)送進(jìn)程發(fā)送至少一個(gè)沒有進(jìn)程歸屬的待發(fā)送消息。
文檔編號(hào)G06F9/46GK103207806SQ20121000902
公開日2013年7月17日 申請(qǐng)日期2012年1月12日 優(yōu)先權(quán)日2012年1月12日
發(fā)明者韓翼 申請(qǐng)人:阿里巴巴集團(tuán)控股有限公司