麻豆精品无码国产在线播放,国产亚洲精品成人AA片新蒲金,国模无码大尺度一区二区三区,神马免费午夜福利剧场

一種發送消息的方法及其系統的制作方法

文檔序號:6363091閱讀:257來源:國知局
專利名稱:一種發送消息的方法及其系統的制作方法
技術領域
本申請涉及計算機分布式系統領域,尤其涉及一種分布式系統中發送消息的方法及其系統。
背景技術
隨著淘寶商城不斷發展,其中的商家不斷增加,用戶也越來越多,為了更好實現對用戶的服務或商家的服務,就需要將很多消息要發給商家或用戶,如發送旺旺消息,淘寶站內的信,短消息及郵件等。一般情況下,上述信息都是通過分布式系統發送消息給用戶或商家,而為了使消息能夠高效的發送,分布式系統采用并發的方式發送消息。下面請參考圖1,其為本申請實施例中分布式系統消息分發的結構示意圖。消息發送系統提供對外接口,以接收來自發送者的消息并保存在消息隊列中,再由消息發送進程分發給接收者。本申請發明人在實現本申請實施例中技術方案的過程中,發現上述現有技術至少存在如下技術問題:在讀取消息隊列的過程中,系統采用單線程讀取多線程分發的模式,即每次只保證有一個進程在讀取消息,然后再開始分發消息。因需保證只有一個進程在讀取消息,系統引入了鎖競爭,故而每次進程都需要判斷是否可讀。具體來說,系統通過加鎖的方式保證只有一個進程在讀取,由于數據庫本身機制的原因,在多線程并發的情況下,可能會造成死鎖。并發的線程越多,造成死鎖的概率就越大。可見,在現有技術中,多進程讀取消息使得系統在發送消息的過程中,非常容易造成死鎖,從而降低系統發送消息的效率。

發明內容
本申請提供了一種發送消息的方法及其系統,以解決了因保證只有一個任務在讀取消息時而造成的死鎖的技術問題,消除了鎖競爭,提高了消息發送效率。一方面,通過本申請的一個實施例,提供如下技術方案:一種發送消息的方法,應用在包括有數據庫,與所述數據庫連接的M個應用服務器和與所述數據庫連接的至少N個消息任務服務器的系統中,其中,所述N個消息任務服務器中每個消息任務服務器包括有一個消息發送進程,M為大于或等于I的整數,N為大于或等于2的整數,所述方法包括:判斷所述N個消息發送進程中每個消息發送進程的狀態是否是有效狀態;基于所述判斷,從所述N個消息發送進程中確定K個消息發送進程的狀為有效狀態,其中K為大于I但小于N的整數;從所述K個消息發送進程中,確定一個消息發送進程作為主消息發送進程;
通過所述主消息發送進程去啟動所述主消息發送進程所在消息任務服務器中的消息調度器;通過所述消息調度器,從所述數據庫的消息隊列中獲得至少一個沒有進程歸屬的待發送消息;從所述K個消息發送進程中,為所述至少一個沒有進程歸屬的待發送消息中每個待發送消息分配一個消息發送進程;通過所述K個消息發送進程發送所述至少一個沒有進程歸屬的待發送消息。另一方面,通過本申請的一個實施例,提供如下技術方案:一種發送消息的系統,包括:M個應用服務器,與至少一個發送端連接,用于接收所述至少一個發送端發送的待發送消息,其中,所述M個應用服務器中每個應用服務器包括一個消息發送接口,M為大于或等于I的整數;數據庫,與所述M個應用服務器連接,用于通過每個應用服務器的所述消息發送,接收所述至少一個待發送消息,并將所述至少一個待發送消息放在一消息隊列中;N個消息任務服務器,與所述數據庫連接,所述N個消息任務服務器中每個消息任務服務器包括有一個消息發送進程;其中,所述N個消息發送進程中有K個消息發送進程的狀態為有效狀態,所述K個消息發送進程中有一個為主消息發送進程;其中,所述主消息發送進程對應的消息任務服務器用于:通過所述主消息發送進程啟動所述主消息發送進程所在消息任務服務器中的消息調度器;通過所述消息調度器,從所述數據庫的消息隊列中獲得至少一個沒有進程歸屬的待發送消息;從所述K個消息發送進程中,為所述至少一個沒有進程歸屬的待發送消息中每個待發送消息分配一個消息發送進程;通過所述K個消息發送進程發送所述至少一個沒有進程歸屬的待發送消息。上述技術方案中的一個或多個技術方案具有如下優點或有益效果:一、通過采用在任務分發過程中進行消息調度的方法,解決了任務分發過程中任務競爭消息造成死鎖的技術問題,從而避免了死鎖,達到了高效發送消息的技術效果。二、由于在消息分發的過程中采用了心跳檢測的技術手段,解決了消息發送過程中,檢測各個任務的有效性,從而達到了及時更新任務狀態的技術效果。三、通過采用消息調度算法和心跳檢測的技術手段,解決了消息在發送過程中,因任務暫停而導致消息閑置等待處理的問題,從而達到了智能的將未發送完成的消息轉移到可用任務的技術效果。


圖1為現有技術中分布式系統消息分發的結構示意圖;圖2為本申請實施例一中消息發送的方法流程圖;圖3為本申請實施例中分配消息發送進程的流程圖;圖4為本申請實施例中發送待發送消息的流程圖5為本申請實施例中消息分配的示例圖;圖6為本申請實施例中消息發送進程的總體流程圖;圖7為本申請實施例中主消息發送進程的調度流程圖;圖8為本申請實施例中分布式系統功能模塊圖。
具體實施例方式為了使本申請所屬技術領域中的技術人員更清楚地理解本申請,下面結合附圖,通過具體的實施例對本申請技術方案作詳細描述。本申請實施例一提供了 一種消息發送方法,在本實施例中,所述方法應用在一個包括有數據庫、應用服務器和消息任務服務器的系統中,所述應用服務器用于產生消息,t匕如產生淘寶站內信、短消息和發送郵件等等,所述數據庫用于存放所述應用服務器產生的此類消息信息,當消息任務服務器需要從數據庫中提取消息時,數據庫就按照消息隊列的順序將存放的消息傳給所述消息任務服務器。而所述消息任務服務器就對所述數據庫存放的消息進行調度以及將上述消息進行發送。所述消息任務服務器在進行調度的時,由于采用多進程機制,因此消息任務服務器會為每個消息調度進程自動分配編號或者由技術人員根據實際情況具體設定。下面請參考圖2,為本申請實施例一中消息發送的方法流程圖;步驟200,判斷所述N個消息發送進程中每個消息發送進程的狀態是否是有效狀態;在具體的實施過程中,應用服務器將創建的消息存放在數據庫中,消息任務服務器將基于創建的消息,創建多個消息發送進程,以N作為參數表示所述多個消息發送進程,具體來講,該步驟將從N個消息發送進程中,判斷每個消息發送進程的狀態是否是有效狀態,可以是判斷每個消息發送進程是否已經注冊,若是注冊的消息發送進程,其狀態即為有效,反之,消息發送進程的狀態則為無效。步驟210,基于所述判斷,從所述N個消息發送進程中確定K個消息發送進程的狀為有效狀態;在具體的實施過程中,基于步驟200的判斷,從所述N個消息發送進程中確定K個消息發送進程的狀態為有效狀態,所述K僅作為一個表示有效狀態的消息發送進程的參數,因為有效狀態的進程數量是小于等于消息發送進程的數量的,所以,K為大于I但小于等于N的整數。步驟220,從所述K個消息發送進程中,確定一個消息發送進程作為主消息發送進程;在具體的實施過程中,可首先檢查K個消息發送該進程中每個消息發送進程是否注冊,對于在所述K個消息發送該進程中已經注冊的消息發送進程,通過心跳線程判斷所述已經注冊的消息發送進程中每個消息發送進程的狀態是暫停還是有效;對于所述已經注冊的消息發送進程中狀態為暫停的消息發送進程,更新消息發送狀態為有效;對于在所述K個消息發送進程中未注冊的消息發送進程,先注冊所述未注冊的消息發送進程中每個消息發送進程,然后通過心跳線程判斷注冊的消息發送進程的狀態是暫停還是有效狀態;對于已經注冊的消息發送進程中狀態為暫停的消息發送進程,更新狀態為有效;最后通過檢查,從所述K個消息發送進程中確定一個狀態為有效的消息發送進程為主消息發送進程。由于每個消息發送進程都具有一個唯一的數字ID,因此,可將進程ID最小的且沒有停止的任務確定為主任務。步驟230,通過所述主消息發送進程啟動所述主消息發送進程所在消息任務服務器中的消息調度器;步驟240,通過所述消息調度器,從所述數據庫的消息隊列中獲得至少一個沒有進程歸屬的待發送消息;在具體的實施過程中,通過步驟230啟動的所述消息調度器,從所述數據庫的消息隊列中,按照消息隊列的順序獲得至少一個沒有進程歸屬的待發送消息。需要說明的是,所述至少一個沒有進程歸屬的待發送消息可包括以下兩種:一種是來自應用服務器新產生的待發送消息;另一種是歸屬于心跳停止的消息發送進程的待發送消息。步驟250,從所述K個消息發送進程中,為所述沒有進程歸屬的待發送消息分配一個消息發送進程;為了更好的說明分配消息發送進程的過程,將步驟250進行拆分,并結合附圖3,詳細說明分配消息發送進程的過程。在具體的實施過程中,分配消息發送進程包括以下步驟:步驟300,計算有效的消息發送進程的數量;在具體的實施過程中,從所述K個消息發送進程中,獲取至少一個狀態為有效的消息發送進程,將所述至少一個狀態為有效的消息發送進程的ID以數組的形式保存在所述消息任務服務器中,并根據數組中的內容,計算狀態為有效的消息發送進程的數量,其中所述數組可以是在消息任務服務器中的內存中存放的臨時數組,也可以是存放在數據庫中的一個存儲空間,本領域所屬的技術人員可以根據實際的情況具體設定。步驟310,計算取模結果;在具體的實施過程中,將所述沒有消息發送進程歸屬的的待發送消息,按照數組中的ID編號和所述待發送消息進程的數量進行取模,獲得取模結果。步驟320,根據所述取模結果,為沒有進程歸屬的待發送消息分配消息發送進程ID ;在具體的實施過程中,根據所述取模結果,為每個狀態為有效的發送進程分配一個還沒有進程歸屬的待發送消息ID。在步驟320步驟,根據所述取模結果,為沒有進程歸屬的待發送消息分配消息發送進程ID之后,將所述沒有消息發送進程歸屬的待發送消息的ID對應的待發送消息分配給對應的狀態為有效的消息發送進程。另外,對于有些心跳停止的消息發送進程,還需進行進一步的處理。比如對于心跳停止的消息發送進程進行后續的處理,下面將繼續描述后續心跳停止的消息發送進程的處理過程;
在所述從所述K個消息發送進程中,為所述至少一個沒有進程歸屬的待發送消息中每個待發送消息分配一個消息發送進程之后,還包括:根據每個消息發送進程的心跳,確定是否有心跳停止的消息發送進程;在具體的實施過程中,心跳是用來檢查進程是否為有效狀態的一種進程,當被檢測的進程停止時,心跳進程就會得到進程停止的通知。基于此心跳,就可以確定是否有心跳停止的消息發送進程。在有一個或多個心跳停止的消息發送進程時,為心跳停止的消息發送進程加鎖,減少了消息調度時產生的鎖競爭。另外,此處具體的加鎖可以采用數據庫的鎖機制。由于分布式系統中,進程的心跳狀態可能會由停止變為有效,比如系統的cpu由繁忙狀態變為空閑狀態,或者進程到達了可以執行的時間段時,所述停止的進程就會恢復成有效的狀態,進而所述消息任務服務器會對后續恢復后可能啟動的進程還將進行進一步的處理。由于在多進程并發的機制下,所述心跳停止的消息發送進程可以重新啟動成為有效的進程,因此,需要判斷所述心跳停止的消息發送進程中是否有消息發送進程已經啟動成為狀態為有效的消息發送進程;在所述心跳停止的消息發送進程中有已經啟動成為狀態為有效的消息發送進程時,為所述已經啟動成為狀態為有效的消息發送進程解鎖;在所述心跳停止的消息發送進程中沒有已經啟動成為狀態為有效的消息發送進程時,將獲得所述沒有啟動成為狀態為有效的消息發送進程中的待發送消息,并將獲得的待發送消息重新分配一個消息狀態為有效的消息發送進程。在上述過程中,對進程的加鎖與解鎖可以采用數據庫的鎖機制即,select forupdate實現,其他相同或相似加解鎖方式亦屬于本申請所保護的范圍。在完成將待發送消息分配給消息發送進程后,進一步的,執行消息發送進程。具體來說,通過所述K個消息發送進程發送所述至少一個沒有進程歸屬的待發送消息;所述參數K僅作為一個具體的實例來表示在具體的實施過程中存在的消息發送進程數量,進一步地,結合附圖4,詳細說明發送待發送消息的過程。通過所述K個消息發送進程發送所述至少一個沒有進程歸屬的待發送消息包括以下步驟:步驟400,根據消息計劃發送時間獲取所屬的消息;在具體的實施過程中,由于每個消息發送進程在存放在數據庫的時候,都會存在一個計劃的發送時間,基于此計劃發送時間,當到達發送時間后,消息發送進程就將獲得K個消息發送進程中每個有效消息發送進程的沒有消息發送進程歸屬的待發送消息,具體的消息發送進程獲得待發送消息的過程請參考圖5中描述的方式;步驟410,更新消息狀態為發送中,并更新發送開始時間;在具體的實施過程中,對于所述一個或多個沒有消息發送進程歸屬的待發送消息中每個待發送消息,更新消息狀態為發送中,更新發送開始時間;步驟420,提交到發送隊列;在具體的實施過程中,提交每個待發送消息到發送隊列,其中所述發送隊列是由消息發送進程構按時間的先后順序進行排列的一個順序列;
步驟430,更新消息狀態為發送成功,更新發送結束時間;在具體的實施過程中,發送所述每個待發送消息,并在發送成功后,更新消息狀態為發送成功,更新發送結束時間。為了使審查員更好的理解本申請,下面將結合附圖5,舉例說明待發送消息的分配及發送過程。因為在分布式系統中,待發送的消息ID是數據的一個自增長序列,每新增一條待發送消息,應用服務器收到發送者的消息后,將消息插入數據庫其序列值就增加1,同樣,進程的ID也是第一次啟動時,往數據庫插入的一條進程記錄,同樣也是自增長序列,序列從I開始,每新增一個進程,序列值增加I。請參考圖5,將所有待發送的消息和可用的進程進行編號,例如總共有7個待發送消息,4個進程,將所述7個進程和所述4個進程按照從小到大的順序排列,下面即以待發送消息的編號分別為1001、1002、1003、...、1007,4個進程編號為進程O、1、2、3作為示例,詳細描述消息和進程之間的分配過程。在具體的實施過程中,待發送消息的編號和消息發送進程的編號在創建的時候都已經分配好了,此處的編號僅作為一個具體的實例以供參考。將待發送消息的ID和進程數量進行取模,獲得取模結果;如消息1001對4取模得1,1002對4取模得2,則消息1003到1007分別獲得的結果分別為3、0、1、2、3 ;基于所述取模結果,將每個消息分配到對應數組下標的進程;將消息1001和1005分配給進程I ;將消息1002和1006分配給進程2 ;將消息1003和1007分配給進程3 ;將消息1004分配給進程0 ;上述分配好的消息正在發送中,若某進程突然停止了,比如進程I停止了,此時,可依照上述方式,根據數組下標重新分配沒有消息發送進程歸屬的待發送消息;對于消息發送進程I中的待發送消息,也可依照上述方式分配給其他消息發送進程。例如,針對待發送消息的編號分別為1001、1002、1003.....1007,各個消息編號分
別對當前消息發送進程數量3取模后,重新分配如下:將消息1001、1003、1007分配給進程3 ;將消息1002和1006分配給進程2 ;將消息1004和1005分配給進程O。也可以只是將當前停止的消息發送進程I中的待發關的消息1001和1005重新分配,如,依據消息1001和1005的消息編號分別對當前消息發送進程數量3取模后,分別分配給消息發送進程3和消息發送進程O。以上步驟為本申請中,消息發送的過程,為了使審查員更好的理解本申請,下面將從進程的角度,詳細說明進程發送的過程。請參考圖6,為本申請實施例中消息發送進程的總體流程圖;步驟600,檢查消息發送進程是否注冊;在具體的實施過程中,系統開始運行后,因為所述消息發送進程在創建時,是由多個消息應用服務器產生的,而在產生的這些進程之后,就需要檢測這些新創建的進程是否是注冊的進程,即驗證這些進程是否為合法的進程。首先檢查消息發送進程是否注冊,從數據庫中篩選出注冊的消息發送進程,若發現沒有注冊的消息發送進程,進行步驟611,將所述沒有注冊的消息發送進程注冊,同時對于已經注冊的消息發送進程,進行步驟610 ;步驟610,啟動心跳線程;在具體的實施過程中,心跳線程會每隔一段時間更新消息發送進程的更新時間,同時在心跳啟動后,心跳線程會隨著消息發送進程的運行而一直運行,隨著消息發送進程的結束而停止。具體來講,所述每隔一段時間可以是事先設定好的時間,例如,心跳線程通過每30秒更新一次消息發送進程的更新時間來保持消息發送進程心跳,需要注意的是,此處所采用的30秒僅僅是本申請實施例中的一種方式,本領域所屬的技術人員可以根據實際情況采用其他的間隔時間,如15秒、20秒等等,其相同或相類似的間隔時間均落入本申請的保護范圍之內。步驟620,檢測消息發送進程的狀態;在具體的實施過程中,基于所述步驟620的心跳線程,檢測每個消息發送進程的狀態,若發現消息發送進程狀態為暫停,進行步驟631,將所述暫停的消息發送進程的狀態更新為有效。步驟630,檢查是否是主消息發送進程;在具體的實施過程中,若當前消息發送進程不是主消息發送進程,則直接進行步驟640,啟動任務發送器,否則進行步驟641,啟動消息調度器。步驟641,啟動消息調度器;在具體的實施過程中,啟動消息調度器首先確定是否有心跳停止的消息發送進程;在有心跳停止的消息發送進程時,為所述心跳停止消息發送進程中每個心跳停止的消息發送進程加鎖。同時,判斷所述心跳停止的消息發送進程中是否有啟動成為狀態為有效的消息發送進程;在所述心跳停止的消息發送進程中有已經啟動成為狀態為有效的進程時,為所述狀態為有效的消息發送進程解鎖;在所述心跳停止的消息發送進程中沒有啟動成為狀態為有效的進程時,獲得所述沒有成為狀態為有效的消息發送進程中的待發送消息;并將這些待發送消息重新分配一個狀態為有效的消息發送進程;同時,為所述沒有啟動成為狀態為有效的消息發送進程解鎖。步驟640,啟動任務發送器;在具體的實施過程中,執行消息發送進程即是發送待發送消息,同前述步驟240的過程一樣,詳細過程此處就不在贅述。另外,執行消息發送進程后,還需要將非主消息發送進程中的消息和經重新分配后的待發送消息發送。以上過程為從進程的角度說明進程的總體流程,對于其主消息發送進程的消息調度情況,下面將詳細說明。下面請參考圖7,為本申請實施例中主消息發送進程的消息調度的流程步驟700,查詢所有有效的消息發送進程,并檢查是否有心跳停止的進程;在具體的實施過程中,從消息發送進程隊列中查詢所有有效的消息發送進程,并檢查是否有心跳停止的消息發送進程,其中,對于有效的消息發送進程,進行步驟701,否則進行步驟710。步驟701,更新心跳停止的消息發送進程為暫停狀態;在具體的實施過程中,由于有效的消息發送進程可能包括心跳活躍和心跳停止消息發送進程,故此步驟是將心跳停止的進程標記為暫停狀態,以便下次查詢就不再查詢到當前消息發送進程,并且將所屬此暫停狀態進程的消息也查出來,方便了后續步驟的進行是否需要重新給這些消息重新分配新的有效進程。所述更新心跳停止的消息發送進程為暫停狀態具體包括:在完成步驟701之后,進行步驟711。步驟710,查詢沒有消息發送進程歸屬的待發送消息;在具體的實施過程中,查詢沒有消息發送進程歸屬的待發送消息具體包括兩種:一種是來自應用服務器新產生的待發送消息;另一種為來自步驟711的待發送消息。步驟711,查詢暫停的消息發送進程所屬的消息;在具體的實施過程中,因該消息發送進程狀態為暫停,故查詢所述消息發送進程攜帶的消息,并將所述消息歸入沒有消息發送進程歸屬的待發送消息之中;獲得了來自步驟711的待發送消息與應用服務器新產生的待發送消息后,進行步驟 720。步驟720,重新對消息分配消息分配進程;在具體的實施過程中,上述過程與步驟250 —致,此處不再贅述。步驟730,檢測是否有心跳;通過心跳線程,檢測每個消息發送進程的心跳狀態。對于有心跳的消息發送進程,進行步驟740,同時對于心跳停止的消息發送進程,進行步驟731。步驟731,查詢心跳停止的消息發送進程的狀態,并加鎖;基于步驟730對每個消息發送進程的心跳檢測,確定是否有心跳停止的消息發送進程;在有一個或多個心跳停止的消息發送進程時,為所述一個或多個心跳停止消息發送進程中每個心跳停止的消息發送進程加鎖。步驟740,更新消息所屬消息發送進程;根據消息調度,更新消息所屬的消息發送進程,其中,所述消息調度過程與步驟250分配消息發送進程的過程一致,此處不再贅述步驟741,判斷是否啟動;在具體的實施過程中,在有一個或多個心跳停止消息發送進程時,為所述一個或多個心跳停止消息發送進程中每個心跳停止的消息發送進程加鎖之后,還包括:判斷所述一個或多個心跳停止的消息發送進程中是否有消息發送進程已經啟動成為狀態為有效的消息發送進程;
若后續啟動了該消息發送進程,則進行步驟742,否則進行750 ;步驟742,只更新待發送消息的所屬消息發送進程,釋放鎖;在具體的實施過程中,在所述一個或多個心跳停止的消息發送進程中有已經啟動成為狀態為有效的消息發送進程時,為所述已經啟動成為狀態為有效的消息發送進程解鎖;同時僅僅只更新新待發送消息所屬消息發送進程。步驟750,更新消息所屬消息發送進程,釋放鎖;在具體的實施過程中,啟動所述消息發送進程時,為所述已經啟動成為狀態為有效的消息發送進程解鎖;在所述一個或多個心跳停止的消息發送進程中沒有已經啟動成為狀態為有效的消息發送進程時,獲得所述沒有啟動成為狀態為有效的消息發送進程中的待發送消息;給所述沒有啟動成為狀態為有效的消息發送進程的待發送消息中每個待發送消息分配一個狀態為有效的消息發送進程;為所述沒有啟動成為狀態為有效的消息發送進程解鎖。在完成步驟750和步驟742之后,進行步驟760。步驟760,發送待發送消息;在具體的實施過程中,發送待發送消息過程同步驟260 —致,此處不再贅述。下面將對本申請實施例中,消息任務服務器內部具體的功能結構做具體描述。請參考圖8,為本申請實施例中發送消息系統的功能模塊圖;如圖所示的發送消息的系統,包括:應用服務器,數據庫和消息任務服務器,所述應用服務器與至少一個發送端連接,用于接收和創建待發送消息,所述數據庫與所述應用服務器連接,用于存放所述應用服務器接收和創建的待發送消息,并將所述待發送消息以消息隊列的形式保存,所述消息任務服務器與所述數據連接,用于存放所述消息任務服務器中創建的消息發送進程,在這些消息發送進程中,包括一個主消息發送進程,用于對所述消息發送進程和所述待發送消息進行調度。其中,所述主消息發送進程對應的消息任務服務器用于:通過所述主消息發送進程啟動所述主消息發送進程所在消息任務服務器中的消息調度器;通過所述消息調度器,從所述數據庫的消息隊列中獲得至少一個沒有進程歸屬的待發送消息;從所述K個消息發送進程中,為所述至少一個沒有進程歸屬的待發送消息中每個待發送消息分配一個消息發送進程;通過所述K個消息發送進程發送所述至少一個沒有進程歸屬的待發送消息。所述消息任務服務器包括:檢測模塊,用于檢查K個消息發送進程中每個消息發送進程是否注冊;判斷模塊,用于對于在所述K個消息發送進程中已經注冊的消息發送進程,通過心跳線程判斷所述已經注冊的消息發送進程中每個消息發送進程的狀態是暫停還是有效;還用于對于在所述K個消息發送進程中未注冊的消息發送進程,通過心跳線程判斷已經注冊的所述未注冊的消息發送進程中每個消息發送進程的狀態是暫停還是有效狀態;更新模塊,用于對于所述已經注冊的消息發送進程中狀態為暫停的消息發送進程,更新消息發送狀態為有效,還用于對于所述已經注冊的所述未注冊的消息發送進程中狀態為暫停的消息發送進程,更新狀態為有效;注冊模塊,用于對于在所述K個消息發送進程中未注冊的消息發送進程,先注冊所述未注冊的消息發送進程中每個消息發送進程;確定模塊,用于通過檢查,從所述K個消息發送進程中確定一個狀態為有效的消息發送進程為主消息發送進程。在具體的實施過程中,所述至少一個沒有進程歸屬的待發送消息,具體包括:新的待發送消息和/或歸屬于心跳停止的消息發送進程的待發送消息。所述消息任務服務器還包括:心跳確定模塊,用于確定是否有心跳停止的消息發送進程;加鎖模塊,用于在有一個或多個心跳停止的消息發送進程時,為所述一個或多個心跳停止消息發送進程中每個心跳停止的消息發送進程加鎖。所述消息任務服務器還包括:心跳判斷模塊,用于判斷所述一個或多個心跳停止的消息發送進程中是否有消息發送進程已經啟動成為狀態為有效的消息發送進程;獲得模塊,用于在所述一個或多個心跳停止消息發送進程中沒有已經啟動成為有效消息發送進程時,獲得所述沒有啟動成為有效消息發送進程的歸屬于心跳停止消息發送進程的待發送消息;解鎖模塊,用于在所述一個或多個心跳停止消息發送進程中有已經啟動成為有效消息發送進程的消息發送進程時,為所述已經啟動成為有效消息發送進程的消息發送進程解鎖,還用于為所述沒有啟動成為有效消息發送進程的消息發送進程解鎖;進程分配模塊,用于給所述沒有啟動成為有效消息發送進程的消息發送進程的歸屬于心跳停止消息發送進程的待發送消息中,每個待發送消息分配一個有效消息發送進程。所述消息任務服務器還包括:消息調度器,用于從所述K個消息發送進程中,獲取至少一個狀態為有效的消息發送進程,將所述至少一個狀態為有效的消息發送進程中每個消息發送進程的ID保存在數組中,并計算所述至少一個狀態為有效的消息發送進程的數量;將所述至少一個沒有消息發送進程歸屬的待發送消息中每個沒有消息發送進程歸屬的待發送消息的ID和所述數量進行取模,獲得取模結果;根據所述取模結果,獲得所述至少一個狀態為有效的消息發送進程中一個或多個狀態為有效的消息發送進程中每個狀態為有效的消息發送進程分配到的一個或多個沒有消息發送進程歸屬的待發送消息的ID ;將所述一個或多個沒有消息發送進程歸屬的待發送消息的ID對應的待發送消息分配給對應的狀態為有效的消息發送進程。所述消息任務服務器器具體包括:消息發送器,用于基于消息計劃發送時間,獲得K個消息發送進程中每個有效消息發送進程的一個或多個沒有消息發送進程歸屬的待發送消息;對于所述一個或多個沒有消息發送進程歸屬的待發送消息中每個待發送消息,更新消息狀態為發送中,更新發送開始時間;提交每個待發送消息到發送隊列;發送所述每個待發送消息,并在發送成功后,更新消息狀態為發送成功,更新發送結束時間。通過本申請上述的一個或多個實施例,可以實現如下技術效果:一、通過采用在消息調度器中調度處理發送消息,解決了現有技術中因消息間競爭而容易造成的死鎖的技術問題,從而達到了降低消息發送進程競爭造成死鎖的技術問題。二、由于在消息分發的過程中采用了心跳檢測的技術手段,解決了消息發送過程中,檢測各個消息發送進程的有效性,從而達到了及時更新消息發送進程狀態的技術效果。三、通過采用消息調度器中的消息重分配方法,解決了未發送完成的消息等待處理的技術問題,達到了智能的將未發送完成的消息轉移到可用的消息發送進程上。盡管已描述了本申請的優選實施例,但本領域內的技術人員一旦得知了基本創造性概念,則可對這些實施例作出另外的變更和修改。所以,所附權利要求意欲解釋為包括優選實施例以及落入本申請范圍的所有變更和修改。顯然,本領域的技術人員可以對本申請進行各種改動和變型而不脫離本發明的精神和范圍。這樣,倘若本申請的這些修改和變型屬于本申請權利要求及其等同技術的范圍之內,則本申請也意圖包含這些改動和變型在內。
權利要求
1.一種發送消息的方法,其特征在于,應用在包括有數據庫,與所述數據庫連接的M個應用服務器和與所述數據庫連接的至少N個消息任務服務器的系統中,其中,所述N個消息任務服務器中每個消息任務服務器包括有一個消息發送進程,M為大于或等于I的整數,所述方法包括: 判斷所述N個消息發送進程中每個消息發送進程的狀態是否是有效狀態; 基于所述判斷,從所述N個消息發送進程中確定K個消息發送進程的狀為有效狀態,其中,K為大于I但小于等于N的整數; 從所述K個消息發送進程中,確定一個消息發送進程作為主消息發送進程; 通過所述主消息發送進程啟動所述主消息發送進程所在消息任務服務器中的消息調度器; 通過所述消息調度器,從所述數據庫的消息隊列中獲得至少一個沒有進程歸屬的待發送消息; 從所述K個消息發送進程中,為所述至少一個沒有進程歸屬的待發送消息中每個待發送消息分配一個消息發送進程; 通過所述K個消息發送進程發送所述至少一個沒有進程歸屬的待發送消息。
2.如權利要求1所述的方法,其特征在于,所述從所述K個消息發送進程中,確定一個消息發送進程作為主消息發送進程,具體包括: 檢查K個消息發送進程中每個消息發送進程是否注冊; 對于在所述K個消息發送進程中已經注冊的消息發送進程,通過心跳線程判斷所述已經注冊的消息發送進程中每個消息發送進程的狀態是暫停還是有效; 對于所述已經注冊的消息發送進程中狀態為暫停的消息發送進程,更新消息發送狀態為有效; 對于在所述K個消息發送進程中未注冊的消息發送進程,先注冊所述未注冊的消息發送進程中每個消息發送進程,然后通過心跳線程判斷已經注冊的所述未注冊的消息發送進程中每個消息發送進程的狀態是暫停還是有效狀態;對于所述已經注冊的所述未注冊的消息發送進程中狀態為暫停的消息發送進程,更新狀態為有效; 通過檢查,從所述K個消息發送進程中確定一個狀態為有效的消息發送進程為主消息發送進程。
3.如權利要求1或2所述的方法,其特征在于,所述至少一個沒有進程歸屬的待發送消息,具體包括:新的待發送消息和/或歸屬于心跳停止的消息發送進程的待發送消息。
4.如權利要求1或2所述的方法,其特征在于,在所述從所述K個消息發送進程中,為所述至少一個沒有進程歸屬的待發送消息中每個待發送消息分配一個消息發送進程之后,還包括: 確定是否有心跳停止的消息發送進程; 在有一個或多個心跳停止的消息發送進程時,為所述一個或多個心跳停止消息發送進程中每個心跳停止的消息發送進程加鎖。
5.如權利要求4所述的方法,其特征在于,在有一個或多個心跳停止消息發送進程時,為所述一個或多個心跳停止消息發送進程中每個心跳停止的消息發送進程加鎖之后,所述方法還包括:判斷所述一個或多個心跳停止的消息發送進程中是否有消息發送進程已經啟動成為狀態為有效的消息發送進程; 在所述一個或多個心跳停止的消息發送進程中有已經啟動成為狀態為有效的消息發送進程時,為所述已經啟動成為狀態為有效的消息發送進程解鎖; 在所述一個或多個心跳停止的消息發送進程中沒有已經啟動成為狀態為有效的消息發送進程時,獲得所述沒有啟動成為狀態為有效的消息發送進程中的待發送消息; 給所述沒有啟動成為狀態為有效的消息發送進程的待發送消息中每個待發送消息分配一個狀態為有效的消息發送進程; 為所述沒有啟動成為狀態為有效的消息發送進程解鎖。
6.如權利要求1所述的方法,其特征在于,從所述K個消息發送進程中,為所述至少一個沒有進程歸屬的待發送消息中每個待發送消息分配一個消息發送進程,具體包括: 從所述K個消息發送進程中,獲取至少一個狀態為有效的消息發送進程,將所述至少一個狀態為有效的消息發送進程中每個消息發送進程的ID保存在數組中,并計算所述至少一個狀態為有效的消息發送進程的數量; 將所述至少一個沒有消息發送進程歸屬的待發送消息中每個沒有消息發送進程歸屬的待發送消息的ID和所述數量進行取模,獲得取模結果; 根據所述取模結果,獲得所述至少一個狀態為有效的消息發送進程中一個或多個狀態為有效的消息發送進程中每個狀態為有效的消息發送進程分配到的一個或多個沒有消息發送進程歸屬的待發送消息的ID ; 將所述一個或多個沒有消息發送進程歸屬的待發送消息的ID對應的待發送消息分配給對應的狀態為有效的消息發送進程。
7.如權利要求1所述的方法,其特征在于,所述通過所述K個消息發送進程發送所述至少一個沒有進程歸屬的待發送消息,具體包括: 基于消息計劃發送時間,獲得K個消息發送進程中每個有效消息發送進程的一個或多個沒有消息發送進程歸屬的待發送消息; 對于所述一個或多個沒有消息發送進程歸屬的待發送消息中每個待發送消息,更新消息狀態為發送中,更新發送開始時間; 提交每個待發送消息到發送隊列; 發送所述每個待發送消息,并在發送成功后,更新消息狀態為發送成功,更新發送結束時間。
8.一種發送消息的系統,其特征在于,包括: M個應用服務器,與至少一個發送端連接,用于接收所述至少一個發送端發送的待發送消息,其中,所述M個應用服務器中每個應用服務器包括一個消息發送接口,M為大于或等于I的整數; 數據庫,與所述M個應用服務器連接,用于通過每個應用服務器的所述消息發送,接收所述至少一個待發送消息,并將所述至少一個待發送消息放在一消息隊列中; N個消息任務服務器,與所述數據庫連接,所述N個消息任務服務器中每個消息任務服務器包括有一個消息發送進程;其中,所述N個消息發送進程中有K個消息發送進程的狀態為有效狀態,所述K個消息發送進程中有一個為主消息發送進程;其中,所述主消息發送進程對應的消息任務服務器用于: 通過所述主消息發送進程啟動所述主消息發送進程所在消息任務服務器中的消息調度器; 通過所述消息調度器,從所述數據庫的消息隊列中獲得至少一個沒有進程歸屬的待發送消息; 從所述K個消息發送進程中,為所述至少一個沒有進程歸屬的待發送消息中每個待發送消息分配一個消息發送進程; 通過所述K個消息發送進程發送所述至少一個沒有進程歸屬的待發送消息。
9.如權利要求8所述的系統,其特征在于,所述消息任務服務器包括: 檢測模塊,用于檢查K個消息發送進程中每個消息發送進程是否注冊; 判斷模塊,用于對于在所述K個消息發送進程中已經注冊的消息發送進程,通過心跳線程判斷所述已經注冊的消息發送進程中每個消息發送進程的狀態是暫停還是有效;還用于對于在所述K個消息發送進程中未注冊的消息發送進程,通過心跳線程判斷已經注冊的所述未注冊的消息發送進程中每個消息發送進程的狀態是暫停還是有效狀態; 更新模塊,用于對于所 述已經注冊的消息發送進程中狀態為暫停的消息發送進程,更新消息發送狀態為有效,還用于對于所述已經注冊的所述未注冊的消息發送進程中狀態為暫停的消息發送進程,更新狀態為有效; 注冊模塊,用于對于在所述K個消息發送進程中未注冊的消息發送進程,先注冊所述未注冊的消息發送進程中每個消息發送進程; 確定模塊,用于通過檢查,從所述K個消息發送進程中確定一個狀態為有效的消息發送進程為主消息發送進程。
10.如權利要求8所述的系統,其特征在于,所述消息任務服務器還包括: 消息調度器,用于從所述K個消息發送進程中,獲取至少一個狀態為有效的消息發送進程,將所述至少一個狀態為有效的消息發送進程中每個消息發送進程的ID保存在數組中,并計算所述至少一個狀態為有效的消息發送進程的數量; 將所述至少一個沒有消息發送進程歸屬的待發送消息中每個沒有消息發送進程歸屬的待發送消息的ID和所述數量進行取模,獲得取模結果; 根據所述取模結果,獲得所述至少一個狀態為有效的消息發送進程中一個或多個狀態為有效的消息發送進程中每個狀態為有效的消息發送進程分配到的一個或多個沒有消息發送進程歸屬的待發送消息的ID ; 將所述一個或多個沒有消息發送進程歸屬的待發送消息的ID對應的待發送消息分配給對應的狀態為有效的消息發送進程。
全文摘要
本申請提供了一種發送消息的方法及其系統,包括判斷N個消息發送進程中每個消息發送進程的狀態是否是有效狀態;基于所述判斷,從N個消息發送進程中確定K個消息發送進程的狀為有效狀態,其中K為大于1但小于等于N的整數;從K個消息發送進程中,確定一個消息發送進程作為主消息發送進程;通過主消息發送進程去啟動主消息發送進程所在消息任務服務器中的消息調度器;通過消息調度器,從數據庫的消息隊列中獲得至少一個沒有進程歸屬的待發送消息;從K個消息發送進程中,為至少一個沒有進程歸屬的待發送消息中每個待發送消息分配一個消息發送進程;通過K個消息發送進程發送至少一個沒有進程歸屬的待發送消息。
文檔編號G06F9/46GK103207806SQ20121000902
公開日2013年7月17日 申請日期2012年1月12日 優先權日2012年1月12日
發明者韓翼 申請人:阿里巴巴集團控股有限公司
網友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
主站蜘蛛池模板: 葫芦岛市| 漠河县| 泰州市| 和静县| 定安县| 陆河县| 伊川县| 青冈县| 玛纳斯县| 德保县| 浦东新区| 苗栗市| 石门县| 怀仁县| 清新县| 宜兰市| 厦门市| 罗源县| 广东省| 高密市| 开阳县| 无极县| 鹤壁市| 同仁县| 镇江市| 许昌市| 望谟县| 阿瓦提县| 苏州市| 临安市| 安吉县| 盐亭县| 吴堡县| 女性| 峡江县| 龙川县| 浦县| 建瓯市| 正镶白旗| 拜城县| 固安县|