專利名稱:一種云消息服務(wù)中實(shí)現(xiàn)消息傳遞的方法和裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明實(shí)施例涉及通信技術(shù)領(lǐng)域,并且更具體地,涉及數(shù)據(jù)安全通道的處理方法及設(shè)備。本發(fā)明實(shí)施例涉及IT技術(shù)領(lǐng)域,并且更具體地,涉及云消息服務(wù)中實(shí)現(xiàn)消息傳遞的方法和裝置。
背景技術(shù):
隨著云計(jì)算和移動(dòng)互聯(lián)網(wǎng)等技術(shù)的發(fā)展,部署在數(shù)據(jù)中心的各類服務(wù)器、PC機(jī)、移動(dòng)設(shè)備等構(gòu)成ー個(gè)復(fù)雜的全球規(guī)模的分布式系統(tǒng),云消息服務(wù)就是采用消息中間件為這個(gè)分布式系統(tǒng)提供通信的服務(wù)。云消息服務(wù)首先應(yīng)實(shí)現(xiàn)消息中間件的高可用性和伸縮性,保證能夠?yàn)榇罅康挠脩籼峁┎婚g斷的服務(wù)能力,并且能夠根據(jù)負(fù)載變化動(dòng)態(tài)調(diào)整資源;其次是在保證前者的情況下提供消息傳遞的順序保證。云消息服務(wù)中實(shí)現(xiàn)高可用性和伸縮性的ー種通常方法是使用分布式的Key-Value (鍵值對(duì))存儲(chǔ)系統(tǒng)實(shí)現(xiàn)數(shù)據(jù)的存儲(chǔ),但是該方法并不能提供順序保證實(shí)現(xiàn)云消息服務(wù)的云消息服務(wù)設(shè)備中每條消息都有多個(gè)副本存儲(chǔ)在多個(gè)服務(wù)器上,當(dāng)分布式程序從云消息服務(wù)設(shè)備上接收消息時(shí),云消息服務(wù)設(shè)備一般基于帶權(quán)重的隨機(jī)選擇算法來選擇一部分服務(wù)器獲取消息,如果分布式程序持續(xù)向云消息服務(wù)設(shè)備請(qǐng)求接收消息,那么按照選擇算法最終將會(huì)遍歷所有的服務(wù)器,所有消息都會(huì)返回給分布式程序,但是由于每次請(qǐng)求都是選擇一部分服務(wù)器來獲取消息,也就無法保證接收消息的順序與發(fā)送消息的順序相同。而很多程序?qū)樞虮WC存在要求,不能提供有效順序保證的云消息服務(wù)存在應(yīng)用上的局限性。如上所述,目前的消息中間件系統(tǒng),還無法實(shí)現(xiàn)在滿足云消息服務(wù)對(duì)于高可用性和伸縮性的要求的同時(shí),又能夠提供很好的順序保證,從而造成云消息服務(wù)在應(yīng)用上的局限性。
發(fā)明內(nèi)容
本發(fā)明實(shí)施例提供了一種云信息服務(wù)中實(shí)現(xiàn)消息傳遞的方法和裝置,能夠在保障云消息服務(wù)的高可用性和伸縮性要求的同時(shí),提供很好的順序保證?!矫?,提供了ー種云消息服務(wù)中實(shí)現(xiàn)消息傳遞的方法,包括,接收第一分布式程序發(fā)送的消息,在分布式Key-Value存儲(chǔ)系統(tǒng)中存儲(chǔ)該消息攜帯的消息數(shù)據(jù),并遞增所述消息對(duì)應(yīng)的消息隊(duì)列的發(fā)送消息序列號(hào);接收第二分布式程序讀取消息數(shù)據(jù)的請(qǐng)求,在分布式Key-Value存儲(chǔ)系統(tǒng)中讀取消息數(shù)據(jù),將讀取的消息數(shù)據(jù)發(fā)送給第二分布式程序,并在該消息數(shù)據(jù)為該消息隊(duì)列的接收消息序列號(hào)對(duì)應(yīng)的消息數(shù)據(jù)時(shí),遞增該消息隊(duì)列的接收消息序列號(hào)。另ー方面,提供了ー種云消息服務(wù)設(shè)備,包括接ロ単元,用于接收第一分布式程序發(fā)送的消息;接收第二分布式程序讀取消息數(shù)據(jù)的請(qǐng)求,以及將存儲(chǔ)單元讀取的消息數(shù)據(jù)發(fā)送給所述第二分布式程序;消息隊(duì)列管理単元,用于通知存儲(chǔ)單元存儲(chǔ)接ロ単元接收的消息攜帯的消息數(shù)據(jù),并遞增所述消息對(duì)應(yīng)的消息隊(duì)列的發(fā)送消息序列號(hào);根據(jù)接ロ單元接收的所述讀取消息數(shù)據(jù)的請(qǐng)求,通知所述存儲(chǔ)單元讀取消息數(shù)據(jù),并在讀取所述消息隊(duì)列的接收消息序列號(hào)對(duì)應(yīng)的消息數(shù)據(jù)成功時(shí),遞增所述消息隊(duì)列的接收消息序列號(hào)。所述存儲(chǔ)単元,包括分布式Key-Value存儲(chǔ)系統(tǒng),用于進(jìn)行所述消息數(shù)據(jù)的存儲(chǔ)或讀取。本發(fā)明實(shí)施例通過為每個(gè)消息隊(duì)列設(shè)置ー個(gè)發(fā)送消息序列號(hào)和一個(gè)接收消息序列號(hào),當(dāng)?shù)谝环植际匠绦虬l(fā)送消息數(shù)據(jù)時(shí),云消息服務(wù)設(shè)備接收數(shù)據(jù)并生成包含發(fā)送消息隊(duì)列發(fā)送消息序列號(hào)的鍵值Key,用消息數(shù)據(jù)作為數(shù)值Value,在分布式Key-Value存儲(chǔ)系統(tǒng)中存儲(chǔ)消息數(shù)據(jù),并遞增修改消息隊(duì)列的發(fā)送消息序列號(hào);當(dāng)?shù)诙植际匠绦蛘?qǐng)求接收消息數(shù)據(jù)時(shí),云消息服務(wù)設(shè)備按照消息隊(duì)列的接收消息序列號(hào)在分布式Key-Value存儲(chǔ)系統(tǒng)中讀取消息數(shù)據(jù),并遞增修改消息隊(duì)列的接收消息序列號(hào)。實(shí)現(xiàn)了云消息服務(wù)的高可用性和伸縮性要求,同時(shí)又保障了消息傳遞的順序保證。
為了更清楚地說明本發(fā)明實(shí)施例的技術(shù)方案,下面將對(duì)實(shí)施例描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)這些附圖獲得其他的附圖。圖I是本發(fā)明實(shí)施例在分布式系統(tǒng)中實(shí)現(xiàn)云消息服務(wù)的系統(tǒng)架構(gòu)圖。圖2是本發(fā)明實(shí)施例中消息隊(duì)列的元數(shù)據(jù)的結(jié)構(gòu)示意圖。圖3是本發(fā)明實(shí)施例中消息數(shù)據(jù)在Key-Value存儲(chǔ)系統(tǒng)中的存儲(chǔ)格式示意圖。圖4是根據(jù)本發(fā)明ー個(gè)實(shí)施例的云消息服務(wù)中實(shí)現(xiàn)消息傳遞的方法。圖5是根據(jù)本發(fā)明另一個(gè)實(shí)施例的云消息服務(wù)中由分布式程序選擇消息傳遞提供順序保證的方法。圖6是根據(jù)本發(fā)明ー個(gè)實(shí)施例的云消息服務(wù)設(shè)備的框圖。
具體實(shí)施例方式下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒有作出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。首先對(duì)順序保證進(jìn)行簡單說明。順序保證是指,在進(jìn)行通信的分布式程序之間,分布式程序接收消息的順序應(yīng)與發(fā)送消息的順序相同,不能出現(xiàn)亂序,例如,分布式程序發(fā)送4條消息的順序是消息A-消息B-消息C-消息D,則分布式程序接收這4條消息的順序也應(yīng)該是消息A-消息B-消息C-消息D,而不能是其他順序,絕大多數(shù)分布式程序都要求能夠提供順序保證。圖I是本發(fā)明實(shí)施例在分布式系統(tǒng)中實(shí)現(xiàn)云消息服務(wù)的系統(tǒng)架構(gòu)圖。下面描述的本發(fā)明實(shí)施例可應(yīng)用于圖I所示的云消息服務(wù)系統(tǒng)架構(gòu)中。如圖I所示,分布式程序發(fā)送消息數(shù)據(jù)給云消息服務(wù)設(shè)備或從云消息服務(wù)設(shè)備中獲取消息數(shù)據(jù),從而實(shí)現(xiàn)分布式程序之間的消息傳遞。分布式程序在分布式模塊上運(yùn)行,分布式程序之間的消息傳遞實(shí)際上是通過分布式模塊間的消息傳遞進(jìn)行傳遞,同一分布式模塊上運(yùn)行的分布式程序之間進(jìn)行消息傳遞也要通過云消息服務(wù)設(shè)備。云消息服務(wù)設(shè)備主要分為三個(gè)部分對(duì)消息隊(duì)列進(jìn)行維護(hù)管理、進(jìn)行消息傳遞的消息隊(duì)列管理単元,實(shí)現(xiàn)消息相關(guān)的數(shù)據(jù)存儲(chǔ)的存儲(chǔ)單元,以及與分布式程序接ロ的接ロ単元。如圖2所示,本發(fā)明實(shí)施例中為每個(gè)消息隊(duì)列設(shè)置一個(gè)發(fā)送消息序列號(hào)和ー個(gè)接收消息序列號(hào)作為消息隊(duì)列的元數(shù)據(jù)。當(dāng)然,根據(jù)應(yīng)用需要,每個(gè)消息隊(duì)列還可能設(shè)置是否保序、未讀取成功消息序列號(hào)、消息隊(duì)列長度等一個(gè)或多個(gè)其他元數(shù)據(jù)。發(fā)送消息序列號(hào)和 接收消息序列號(hào)均為ー個(gè)從初始狀態(tài)開始遞增的序列,兩者的初始狀態(tài)應(yīng)該一致,如均從O 開始遞增,或均從I開始遞増。分布式程序每發(fā)送一條消息到消息隊(duì)列中,該消息隊(duì)列的發(fā)送消息序列號(hào)就遞增加一,分布式程序每從ー個(gè)消息隊(duì)列中接收一條消息,該消息隊(duì)列的接收消息序列號(hào)就遞增加一。定義ー個(gè)消息序列號(hào)的最大值,當(dāng)發(fā)送消息序列號(hào)超過消息序列號(hào)最大值時(shí),發(fā)送消息序列號(hào)進(jìn)行反轉(zhuǎn),即重新從初始狀態(tài),例如O開始計(jì)數(shù),同樣的,接收消息序列號(hào)超過消息序列號(hào)最大值時(shí)也會(huì)進(jìn)行發(fā)轉(zhuǎn)。當(dāng)ー個(gè)消息隊(duì)列的接收消息序列號(hào)小于發(fā)送消息序列號(hào),或接收消息序列號(hào)大于發(fā)送消息序列號(hào)但發(fā)送消息隊(duì)列號(hào)比接收消息序列號(hào)多進(jìn)行了一次反轉(zhuǎn)時(shí),表示該消息隊(duì)列中仍然存在未被分布式程序接收的消息,分布式程序可以從該消息隊(duì)列接收消息,當(dāng)接收消息序列號(hào)等于發(fā)送消息序列號(hào)時(shí),表示消息隊(duì)列中的消息已經(jīng)被接收完了,則不會(huì)從該消息隊(duì)列讀取消息給分布式程序。一般,消息序列號(hào)最大值會(huì)設(shè)置足夠大,以避免出現(xiàn)反轉(zhuǎn)的發(fā)送消息序列號(hào)接收消息數(shù)據(jù)并遞增,最終超過少反轉(zhuǎn)一次的接收消息序列號(hào)而導(dǎo)致未讀取的消息數(shù)據(jù)被覆蓋的情況。如圖3所示,消息數(shù)據(jù)在分布式Key-Value存儲(chǔ)系統(tǒng)中進(jìn)行存儲(chǔ)時(shí),用包含消息序列號(hào)的信息組成Key,具體組成規(guī)則中至少要包含消息隊(duì)列標(biāo)識(shí)、消息序列號(hào),例如Key的組成可以為消息隊(duì)列標(biāo)識(shí)+消息序列號(hào),或?yàn)橄⑿蛄刑?hào)+消息隊(duì)列標(biāo)識(shí),并可根據(jù)需要添加其他信息作為Key的前綴或后綴等,例如消息長度。用接收到的分布式程序消息中攜帯的消息數(shù)據(jù)作為Value,云消息服務(wù)設(shè)備接收的分布式程序所發(fā)送的消息一般會(huì)攜帯消息隊(duì)列名稱、消息數(shù)據(jù),有時(shí)也會(huì)包含時(shí)間戳、數(shù)字簽名等信息,本發(fā)明實(shí)施例中僅指保存消息數(shù)據(jù)部分,當(dāng)然,根據(jù)實(shí)際應(yīng)用的消息傳遞需要也可以保存消息攜帯的其他信息。因此,實(shí)現(xiàn)了在分布式Key-Value存儲(chǔ)系統(tǒng)中存儲(chǔ)和訪問消息數(shù)據(jù),通過包含消息序列號(hào)的Key直接定位查找到分布式存儲(chǔ)系統(tǒng)中的消息數(shù)據(jù)。分布式程序發(fā)送消息吋,云消息服務(wù)設(shè)備修改消息隊(duì)列的發(fā)送消息序列號(hào),并把發(fā)送消息序列號(hào)作為消息序列號(hào)按照規(guī)則生成Key,按照所生成的Key在分布式Key-Value存儲(chǔ)系統(tǒng)中進(jìn)行消息數(shù)據(jù)的存儲(chǔ)。分布式程序需要接收消息時(shí),云消息服務(wù)設(shè)備把消息隊(duì)列的接收消息序列號(hào)作為消息序列號(hào)按照規(guī)則生成Key,按照所生成的Key到分布式Key-Value存儲(chǔ)系統(tǒng)中讀取消息數(shù)據(jù),從而實(shí)現(xiàn)了消息傳遞的順序保證。此外,程序通過消息中間件進(jìn)行消息傳遞,往往還有分發(fā)保證的要求。分發(fā)保證的模型一般分為三種最多一次分發(fā)、至少一次分發(fā)和嚴(yán)格一次分發(fā)。最多一次分發(fā)是指對(duì)于每一條消息,向消息中間件請(qǐng)求接收消息的分布式程序最多只會(huì)接收到一次,但可能會(huì)出現(xiàn)接收不到的情況。至少一次分發(fā)是指對(duì)于每一條消息,向消息中間件請(qǐng)求接收消息的分布式程序一定可以接收到,但可能會(huì)出現(xiàn)重復(fù)接收的情況。嚴(yán)格一次分發(fā)是指對(duì)于每一條消息,向消息中間件請(qǐng)求接收消息的分布式程序一定可以接收到,并且只會(huì)接收到一次。通常來說,大多數(shù)應(yīng)用程序期望嚴(yán)格一次分發(fā)的保證。云消息服務(wù)中實(shí)現(xiàn)高可用性和伸縮性的通常方法是使用分布式的Key-Value存儲(chǔ)系統(tǒng)進(jìn)行消息數(shù)據(jù)的存儲(chǔ),但是該方法并不能提供分發(fā)保證云消息服務(wù)設(shè)備中每條消息數(shù)據(jù)都有多個(gè)副本存儲(chǔ)在多個(gè)服務(wù)器上,當(dāng)分布式程序從云消息服務(wù)設(shè)備上接收消息數(shù)據(jù)時(shí),云消息服務(wù)設(shè)備一般基于帶權(quán)重的隨機(jī)選擇算法來選擇一部分服務(wù)器獲取消息數(shù)據(jù),分布式程序持續(xù)向云消息服務(wù)設(shè)備請(qǐng)求接收消息數(shù)據(jù),那么最終將會(huì)遍歷所有的服務(wù)器,所有消息數(shù)據(jù)都會(huì)返回給程序,如果一次分布式程序請(qǐng)求接收消息數(shù)據(jù),而存儲(chǔ)了被接收消息數(shù)據(jù)副本的某個(gè)服務(wù)器發(fā)生故障,那么故障服務(wù)器上的這條消息數(shù)據(jù)的狀態(tài)不會(huì)變?yōu)橐呀邮栈蛘邉h除,在下一次請(qǐng)求接收消息數(shù)據(jù)時(shí),該服務(wù)器從故障狀態(tài)恢復(fù)之后,這條消息數(shù)據(jù)就會(huì)被重復(fù)接收,也就是會(huì)出現(xiàn)重復(fù)消息,只能保證至少一次分發(fā)。而很多應(yīng)用程序?qū)Ψ职l(fā)保證存在要求,不能提供嚴(yán)格一次分發(fā)保證的云消息服務(wù)存在應(yīng)用上的局限性。綜上所述,目前的消息中間件系統(tǒng),還不能在既滿足云消息服務(wù)的高可用性和伸縮性的要求,又能夠提供很好的順序保證,并進(jìn)一歩提供分發(fā)保證的能力,從而造成云消息服務(wù)在應(yīng)用 上的局限性。每個(gè)消息隊(duì)列都設(shè)置了至少包括消息隊(duì)列標(biāo)識(shí)、發(fā)送消息序列號(hào)、接收消息序列號(hào)的元數(shù)據(jù),可以將消息隊(duì)列的元數(shù)據(jù)存儲(chǔ)在關(guān)系型數(shù)據(jù)庫中,借助關(guān)系型數(shù)據(jù)庫的特點(diǎn)保證元數(shù)據(jù)操作的事務(wù)性,即當(dāng)云消息服務(wù)中多個(gè)程序或者多個(gè)服務(wù)器節(jié)點(diǎn)需要同時(shí)更新ー個(gè)消息隊(duì)列的元數(shù)據(jù)時(shí),所有操作將被作為ー個(gè)単獨(dú)的操作對(duì)待,要么成功完成,要么根本不執(zhí)行,不會(huì)出現(xiàn)一部分成功一部分失敗的情況,也就不會(huì)出現(xiàn)元數(shù)據(jù)操作重復(fù)的情況,按照不會(huì)操作重復(fù)的消息隊(duì)列的發(fā)送消息序列號(hào)、接收消息序列號(hào)進(jìn)行消息數(shù)據(jù)的讀取,也就避免了出現(xiàn)重復(fù)消息,從而實(shí)現(xiàn)了嚴(yán)格一次的分發(fā)保證能力。本發(fā)明實(shí)施例在圖I所述的系統(tǒng)架構(gòu)上,當(dāng)?shù)谝环植际匠绦虬l(fā)送消息數(shù)據(jù)時(shí),云消息服務(wù)設(shè)備接收消息數(shù)據(jù),按照消息隊(duì)列的發(fā)送消息序列號(hào)在分布式Key-Value存儲(chǔ)系統(tǒng)中存儲(chǔ)消息數(shù)據(jù),并遞增修改發(fā)送消息序列號(hào);當(dāng)?shù)诙植际匠绦蛘?qǐng)求接收消息數(shù)據(jù)時(shí),云消息服務(wù)設(shè)備按照消息隊(duì)列的接收消息序列號(hào)讀取消息數(shù)據(jù),并遞增修改接收消息序列號(hào),實(shí)現(xiàn)了云消息服務(wù)的消息傳遞的順序保證。從而滿足了云消息服務(wù)的高可用性和伸縮性要求,同時(shí)又實(shí)現(xiàn)了消息的順序保證。并進(jìn)一歩地,可以通過將消息隊(duì)列的包括消息隊(duì)列標(biāo)識(shí)、發(fā)送消息序列號(hào)、接收消息序列號(hào)的元數(shù)據(jù)存儲(chǔ)在關(guān)系型數(shù)據(jù)庫中實(shí)現(xiàn)嚴(yán)格一次的分發(fā)保證能力。從而滿足了云消息服務(wù)的高可用性和伸縮性要求,又同時(shí)保障了消息的順序保證及分發(fā)保證。圖4是本發(fā)明一個(gè)實(shí)施例云消息服務(wù)中實(shí)現(xiàn)消息傳遞的方法。401,接收第一分布式程序發(fā)送的消息,在分布式Key-Value存儲(chǔ)系統(tǒng)中存儲(chǔ)所接收消息攜帯的消息數(shù)據(jù),并遞增消息所對(duì)應(yīng)的消息隊(duì)列的發(fā)送消息序列號(hào)。可以采用如下的方法,接收到第一分布式程序發(fā)送的消息,消息攜帯包含需要傳遞消息數(shù)據(jù)的消息隊(duì)列的消息隊(duì)列標(biāo)識(shí),用該消息隊(duì)列的發(fā)送消息序列號(hào)生成包含消息序列號(hào)的鍵值Key,鍵值Key中至少要包含消息隊(duì)列標(biāo)識(shí)、消息序列號(hào),具體格式可以為消息隊(duì)列標(biāo)識(shí)+消息序列號(hào),或?yàn)橄⑿蛄刑?hào)+消息隊(duì)列標(biāo)識(shí),并可根據(jù)業(yè)務(wù)需要添加其他信息,如消息長度等。從而按照所生成的Key在分布式Key-Value存儲(chǔ)系統(tǒng)中存儲(chǔ)收到的消息攜帯的消息數(shù)據(jù),并將該消息隊(duì)列的發(fā)送消息序列號(hào)遞增加一。402,接收第二分布式程序讀取消息數(shù)據(jù)的請(qǐng)求,在分布式Key-Value存儲(chǔ)系統(tǒng)中讀取消息數(shù)據(jù),將讀取的消息數(shù)據(jù)發(fā)送給第二分布式程序,并在該消息數(shù)據(jù)為該消息隊(duì)列的接收消息序列號(hào)對(duì)應(yīng)的消息數(shù)據(jù)時(shí),遞增該消息隊(duì)列的接收消息序列號(hào)。假如消息數(shù)據(jù)讀取方式為讀取的是該消息隊(duì)列的接收消息序列號(hào)對(duì)應(yīng)的消息數(shù)據(jù),此時(shí),需要遞增該消息隊(duì)列的接收消息序列號(hào)。可以采用如下的方法,接收第二分布式程序讀取消息數(shù)據(jù)的請(qǐng)求,請(qǐng)求中包含讀取消息數(shù)據(jù)的消息隊(duì)列標(biāo)識(shí),當(dāng)該消息隊(duì)列的接收消息序列號(hào)不等于發(fā)送消息序列號(hào)吋,用接收消息序列號(hào)生成鍵值Key,當(dāng)然,此處生成Key的格式應(yīng)與接收消息數(shù)據(jù)時(shí)生成鍵值Key 一致,按照所生成的Key在分布式Key-Value存儲(chǔ)系統(tǒng)中讀取消息數(shù)據(jù),若讀取成功,貝U將讀取的消息數(shù)據(jù)傳遞給第二分布式程序,并將該消息隊(duì)列的接收消息序列號(hào)遞增加一。當(dāng)該消息隊(duì)列的接收消息序列號(hào)等于發(fā)送消息序列號(hào)時(shí),不讀取消息數(shù)據(jù)。第二分布式程 序讀取消息數(shù)據(jù)請(qǐng)求也可能一次申請(qǐng)讀取多條消息數(shù)據(jù),這時(shí)的實(shí)現(xiàn)方法和上面類似,只是會(huì)重復(fù)進(jìn)行多次讀取消息數(shù)據(jù)和修改接收消息序列號(hào)的操作。當(dāng)然,消息隊(duì)列的發(fā)送消息序列號(hào)和接收消息序列號(hào)均會(huì)定義ー個(gè)最大值,如果消息序列號(hào)超過定義的最大值,則消息序列號(hào)會(huì)進(jìn)行反轉(zhuǎn),即重新從初始值開始計(jì)數(shù)。例如,消息序列號(hào)的最大值定義為255,初始值為0,當(dāng)發(fā)送消息序列號(hào)為255時(shí)又接收到一條消息,此時(shí)會(huì)把消息隊(duì)列的發(fā)送消息序列號(hào)修改為O。上述的401、402步驟中,對(duì)消息序列號(hào)進(jìn)行遞增處理時(shí),如果達(dá)到了消息序列號(hào)的最大值,則將消息序列號(hào)進(jìn)行反轉(zhuǎn)處理。本實(shí)施例中優(yōu)選地將消息隊(duì)列的元數(shù)據(jù)存儲(chǔ)在關(guān)系型數(shù)據(jù)庫中,實(shí)現(xiàn)消息傳遞的嚴(yán)格一次的分發(fā)保證能力。也可以以消息隊(duì)列標(biāo)識(shí)作為鍵值Key,元數(shù)據(jù)作為Value存儲(chǔ)在分布式Key-Value存儲(chǔ)系統(tǒng)中。相應(yīng)地,步驟401、402會(huì)到關(guān)系型數(shù)據(jù)庫或分布式Key-Value存儲(chǔ)系統(tǒng)中讀取或修改元數(shù)據(jù)。上述元數(shù)據(jù)中至少包含消息隊(duì)列標(biāo)識(shí)、發(fā)送消息序列號(hào)、接收消息序列號(hào)信息。本發(fā)明實(shí)施例在當(dāng)?shù)谝环植际匠绦虬l(fā)送消息數(shù)據(jù)時(shí),云消息服務(wù)設(shè)備按照消息隊(duì)列的發(fā)送消息序列號(hào)在分布式Key-Value存儲(chǔ)系統(tǒng)中存儲(chǔ)消息,并遞增修改消息隊(duì)列的發(fā)送消息序列號(hào);當(dāng)?shù)诙植际匠绦蛘?qǐng)求接收消息數(shù)據(jù)時(shí),云消息服務(wù)設(shè)備根據(jù)消息隊(duì)列的接收消息序列號(hào)讀取消息數(shù)據(jù),并遞增修改消息隊(duì)列的接收消息序列號(hào),實(shí)現(xiàn)了云消息服務(wù)的消息傳遞的順序保證。并進(jìn)一歩地,通過在關(guān)系型數(shù)據(jù)庫中存儲(chǔ)和修改消息隊(duì)列的元數(shù)據(jù),提供了嚴(yán)格一次的分發(fā)保證能力,從而保障了消息傳遞的順序保證及嚴(yán)格一次分發(fā)保證。圖5是根據(jù)本發(fā)明另一個(gè)實(shí)施例的云消息服務(wù)中由分布式程序選擇是否需要消息傳遞提供順序保證的方法。圖5中在讀取消息數(shù)據(jù)不成功吋,由分布式程序選擇是否需要消息傳遞提供順序保證,來確定消息數(shù)據(jù)的讀取順序,本實(shí)施例在圖4所示實(shí)施例的基礎(chǔ)上對(duì)其中的402步驟進(jìn)行了細(xì)化,而接收第一分布式程序發(fā)送消息數(shù)據(jù)的步驟與圖4所示實(shí)施例中401步驟的方法基本相同,因此省略了接收第一分布式程序發(fā)送消息數(shù)據(jù)步驟的圖不和描述。501,接收第二分布式程序讀取消息數(shù)據(jù)的請(qǐng)求,在分布式Key-Value存儲(chǔ)系統(tǒng)中讀取消息。
可以采用如下的方法,接收第二分布式程序讀取消息數(shù)據(jù)的請(qǐng)求,請(qǐng)求中包含讀取消息數(shù)據(jù)的消息隊(duì)列標(biāo)識(shí),當(dāng)該消息隊(duì)列的接收消息序列號(hào)不等于發(fā)送消息序列號(hào)吋,用接收消息序列號(hào)生成鍵值Key,生成Key的格式應(yīng)與接收消息數(shù)據(jù)時(shí)生成Key的格式一樣,按照所生成的Key在分布式Key-Value存儲(chǔ)系統(tǒng)中讀取消息數(shù)據(jù)。當(dāng)該消息隊(duì)列的接收消息序列號(hào)等于發(fā)送消息序列號(hào)時(shí),不讀取消息數(shù)據(jù)。502,501步驟中在分布式Key-Value存儲(chǔ)系統(tǒng)中讀取消息數(shù)據(jù)是否成功。當(dāng)存儲(chǔ)消息數(shù)據(jù)的ー個(gè)或多個(gè)存儲(chǔ)系統(tǒng)節(jié)點(diǎn)發(fā)生故障等情況,會(huì)導(dǎo)致云消息服務(wù)設(shè)備讀取消息數(shù)據(jù)不成功。503,如果502步驟中讀取消息數(shù)據(jù)不成功,則進(jìn)一歩判斷該第二分布式程序的消息傳遞是否需要順序保證。第二分布式程序是否需要消息傳遞的順序保證可以根據(jù)該消息隊(duì)列的元數(shù)據(jù)“是 否保序”的值來判斷,值為是則表示需要順序保證,為否則表示不需要順序保證。進(jìn)ー步地,消息隊(duì)列的“是否保序”的值可以由分布式程序通過命令消息設(shè)置,此處的分布式程序可以是消息傳遞中發(fā)送消息數(shù)據(jù)的第一分布式程序也可以是接收消息數(shù)據(jù)的第二分布式程序。例如,第一分布式程序發(fā)送包含需要保序指示的參數(shù)的命令消息,將消息隊(duì)列的“是否保序”的值設(shè)為是。也可以在第二分布式程序讀取消息數(shù)據(jù)的請(qǐng)求中或者在第一分布式程序發(fā)送消息數(shù)據(jù)的消息中提供參數(shù)設(shè)置消息隊(duì)列“是否保序”的值,例如在第二分布式程序讀取消息數(shù)據(jù)的請(qǐng)求中包含參數(shù)指示需要保序,則將消息隊(duì)列“是否保序”的值置為是。此外,判斷第二分布式程序是否需要消息傳遞的順序保證也可以根據(jù)第二分布式程序在讀取消息數(shù)據(jù)的請(qǐng)求中包含的指示是否保序的參數(shù),當(dāng)指示保序則表示需要順序保證,指示不保序則表示不需要順序保證。如果確定該第二分布式程序消息傳遞需要提供順序保證,則本次消息數(shù)據(jù)讀取流程結(jié)束,不會(huì)修改接收消息序列號(hào)。這樣,在進(jìn)行下次消息數(shù)據(jù)讀取流程時(shí),按照接收消息序列號(hào)會(huì)繼續(xù)讀取本次未讀取的消息數(shù)據(jù),直到成功讀取到該消息數(shù)據(jù)為止,從而實(shí)現(xiàn)順序保證。504,如果503步驟中確定該第二分布式程序消息傳遞不需要提供順序保證,則記錄讀取不成功的消息序列號(hào),讀取下ー接收消息序列號(hào)的消息數(shù)據(jù)。具體可以為,在該消息隊(duì)列的未讀取成功消息序列號(hào)中添加本次未讀取成功的消息序列號(hào),并遞增消息隊(duì)列的接收消息序列號(hào),讀取下一個(gè)接收消息序列號(hào)的消息數(shù)據(jù),直至讀取消息數(shù)據(jù)成功或消息隊(duì)列中已無消息數(shù)據(jù)可讀,即該消息隊(duì)列的接收消息序列號(hào)等于發(fā)送消息序列號(hào)。505,將讀取的消息數(shù)據(jù)返回給第二分布式程序,并修改消息隊(duì)列的接收消息序列號(hào)。具體可以為,將讀取成功的消息數(shù)據(jù)返回給第二分布式程序,并修改該消息隊(duì)列的接收消息序列號(hào)為讀取成功的消息序列號(hào)加I。正常的消息數(shù)據(jù)讀取方式中,讀取的是該消息隊(duì)列的接收消息序列號(hào)對(duì)應(yīng)的消息數(shù)據(jù),此時(shí),需要遞增該消息隊(duì)列的接收消息序列號(hào),即該消息隊(duì)列的接收消息序列號(hào)為讀取成功的消息序列號(hào)加I。同樣的,消息隊(duì)列的接收消息序列號(hào)會(huì)定義ー個(gè)最大值,如果接收消息序列號(hào)超過定義的最大值,則消息序列號(hào)會(huì)進(jìn)行反轉(zhuǎn),即重新從初始值開始計(jì)數(shù)。在本發(fā)明實(shí)施例中,進(jìn)ー步地,在步驟501中接收到第二分布式程序讀取消息數(shù)據(jù)的請(qǐng)求,會(huì)首先確定該消息隊(duì)列中是否有原讀取不成功被跳過的未讀消息數(shù)據(jù),如有則讀取該消息數(shù)據(jù)。
具體實(shí)施方式
可以為判斷該消息隊(duì)列的元數(shù)據(jù)“未讀取成功消息序列號(hào)”是否為空,如有未讀取成功的消息數(shù)據(jù),則從未讀取成功消息序列號(hào)中獲取ー個(gè)消息序列號(hào),采用該消息序列號(hào)生成鍵值Key,按照所生成的Key在分布式Key-Value存儲(chǔ)系統(tǒng)中讀取消息數(shù)據(jù),如果讀取成功則將讀取的消息數(shù)據(jù)傳遞給第二分布式程序,并在該消息隊(duì)列的未讀取成功消息序列號(hào)中刪除本次已讀取的消息序列號(hào),本次消息數(shù)據(jù)讀取過程結(jié)束。如讀取不成功則繼續(xù)從未讀取成功消息序列號(hào)中獲取下ー個(gè)消息序列號(hào),直至讀取消息數(shù) 據(jù)成功或未讀取成功消息序列號(hào)中已沒有新的消息序列號(hào)可以進(jìn)行消息數(shù)據(jù)讀取。如該消息隊(duì)列的未讀取成功消息序列號(hào)為空或未讀取成功消息序列號(hào)中所有消息序列號(hào)對(duì)應(yīng)的消息數(shù)據(jù)均讀取不成功,則按照正常的消息數(shù)據(jù)讀取方式讀取該消息隊(duì)列的接收消息序列號(hào)對(duì)應(yīng)的消息數(shù)據(jù)。第二分布式程序讀取消息數(shù)據(jù)請(qǐng)求也可能一次申請(qǐng)讀取多條消息數(shù)據(jù),這時(shí)的實(shí)現(xiàn)方法和上面類似,只是會(huì)重復(fù)進(jìn)行多次讀取消息數(shù)據(jù)和修改接收消息序列號(hào)的操作。本發(fā)明實(shí)施例中鍵值Key至少要包含消息隊(duì)列標(biāo)識(shí)、消息序列號(hào),具體格式可以為消息隊(duì)列標(biāo)識(shí)+消息序列號(hào),或?yàn)橄⑿蛄刑?hào)+消息隊(duì)列標(biāo)識(shí),并可根據(jù)業(yè)務(wù)需要添加其他信息,如消息長度等,在分布式Key-Value存儲(chǔ)系統(tǒng)中存儲(chǔ)第一分布式模塊發(fā)送的消息數(shù)據(jù)與讀取消息數(shù)據(jù)給第二分布式程序時(shí)生成鍵值Key的格式應(yīng)相同。本實(shí)施例中優(yōu)選地將消息隊(duì)列的元數(shù)據(jù)存儲(chǔ)在關(guān)系型數(shù)據(jù)庫中,也可以以消息隊(duì)列標(biāo)識(shí)作為鍵值Key,元數(shù)據(jù)作為Value存儲(chǔ)在分布式Key-Value存儲(chǔ)系統(tǒng)中。相應(yīng)地,會(huì)到關(guān)系型數(shù)據(jù)庫或分布式Key-Value存儲(chǔ)系統(tǒng)中讀取或修改元數(shù)據(jù)。上述元數(shù)據(jù)中至少包含消息隊(duì)列標(biāo)識(shí)、發(fā)送消息序列號(hào)、接收消息序列號(hào)、是否保序、未讀取成功消息序列號(hào)等信息。本發(fā)明實(shí)施例在第一分布式程序發(fā)送消息數(shù)據(jù)時(shí),在分布式Key-Value存儲(chǔ)系統(tǒng)中存儲(chǔ)消息數(shù)據(jù),并遞增修改消息隊(duì)列的發(fā)送消息序列號(hào);在第二分布式程序請(qǐng)求消息數(shù)據(jù)時(shí),根據(jù)消息隊(duì)列的接收消息序列號(hào)讀取消息數(shù)據(jù),當(dāng)讀取消息數(shù)據(jù)失敗時(shí),根據(jù)分布式程序是否需要順序保證的設(shè)置確定是否繼續(xù)讀取該消息數(shù)據(jù)直至讀取成功,或者遞增修改消息隊(duì)列的接收消息序列號(hào),繼續(xù)讀取下一個(gè)接收消息序列號(hào)的消息數(shù)據(jù),同時(shí)將未讀取成功的消息序列號(hào)記錄下來,在后續(xù)第二分布式程序請(qǐng)求讀取消息數(shù)據(jù)時(shí)再進(jìn)行讀取。從而實(shí)現(xiàn)了根據(jù)分布式程序的設(shè)置確定是否需要云消息服務(wù)提供嚴(yán)格的順序保證。并進(jìn)一歩地,通過在關(guān)系型數(shù)據(jù)庫中存儲(chǔ)和修改消息隊(duì)列的元數(shù)據(jù),提供了嚴(yán)格一次的分發(fā)保證能力,從而保障了消息傳遞的順序保證及分發(fā)保證。圖6是根據(jù)本發(fā)明ー個(gè)實(shí)施例的云消息服務(wù)設(shè)備的框圖。圖6的云消息服務(wù)設(shè)備包括接ロ単元601、消息隊(duì)列管理単元602和存儲(chǔ)單元603。接ロ単元601用于接收第一分布式程序發(fā)送的消息;接收第二分布式程序讀取消息數(shù)據(jù)的請(qǐng)求,以及將存儲(chǔ)單元603讀取的消息數(shù)據(jù)發(fā)送給第二分布式程序。消息隊(duì)列管理單元602用于通知存儲(chǔ)單元603存儲(chǔ)接ロ単元601接收的消息攜帯的消息數(shù)據(jù),并遞增所述消息對(duì)應(yīng)的消息隊(duì)列的發(fā)送消息序列號(hào);根據(jù)接ロ単元601接收的讀取消息數(shù)據(jù)的請(qǐng)求,通知存儲(chǔ)單元603讀取消息數(shù)據(jù),并在讀取該消息隊(duì)列的接收消息序列號(hào)對(duì)應(yīng)的消息數(shù)據(jù)成功吋,遞增該消息隊(duì)列的接收消息序列號(hào)。存儲(chǔ)單元603,包括分布式Key-Value存儲(chǔ)系統(tǒng),用于進(jìn)行所述消息數(shù)據(jù)的存儲(chǔ)或讀取??梢圆捎萌缦碌姆椒?,接ロ単元接收到第一分布式程序發(fā)送的消息,消息中包含需要傳遞消息數(shù)據(jù)的消息隊(duì)列的消息隊(duì)列標(biāo)識(shí),消息隊(duì)列管理単元用該消息隊(duì)列的發(fā)送消息序列號(hào)生成包含消息序列號(hào)的鍵值Key。消息隊(duì)列管理単元通知存儲(chǔ)單元根據(jù)鍵值Key在分布式Key-Value存儲(chǔ)系統(tǒng)中存儲(chǔ)收到的消息攜帯的消息數(shù)據(jù),消息隊(duì)列管理単元將該消息隊(duì)列的發(fā)送消息序列號(hào)遞增加一。接ロ単元接收到第二分布式程序讀取消息數(shù)據(jù)的請(qǐng)求,請(qǐng)求中包含讀取消息數(shù)據(jù)的消息隊(duì)列標(biāo)識(shí)。當(dāng)該消息隊(duì)列的接收消息序列號(hào)不等于發(fā)送消息序列號(hào)時(shí),消息隊(duì)列管理單元用接收消息序列號(hào)生成鍵值Key,通知存儲(chǔ)單元在分布式Key-Value存儲(chǔ)系統(tǒng)中讀取消息數(shù)據(jù)。若讀取成功,接ロ単元將讀取的消息數(shù)據(jù)傳遞給第二分布式程序,消息隊(duì)列管理單元將該消息隊(duì)列的接收消息序列號(hào)遞增加一。 進(jìn)ー步地,如果存儲(chǔ)單元讀取消息數(shù)據(jù)不成功,則消息隊(duì)列管理単元判斷第二分布式程序的消息傳遞是否需要順序保證。如果需要提供順序保證,則消息隊(duì)列管理単元會(huì)通知存儲(chǔ)單元繼續(xù)讀取本次未讀取的消息數(shù)據(jù),直到成功讀取到該消息數(shù)據(jù)為止。如果第二分布式程序消息傳遞不需要提供順序保證,則消息隊(duì)列管理単元記錄讀取不成功的消息序列號(hào),并遞增消息隊(duì)列的接收消息序列號(hào),通知存儲(chǔ)單元讀取下ー接收消息序列號(hào)的消息數(shù)據(jù)。具體方法可以為,消息隊(duì)列管理単元在該消息隊(duì)列的未讀取成功消息序列號(hào)中添加本次未讀取成功的消息序列號(hào),并讀取下一個(gè)接收消息序列號(hào)的消息數(shù)據(jù),直至讀取消息數(shù)據(jù)成功或消息隊(duì)列中已無消息數(shù)據(jù)可讀,即該消息隊(duì)列的接收消息序列號(hào)等于發(fā)送消息序列號(hào)。上述消息隊(duì)列管理単元判斷第二分布式程序是否需要消息傳遞的順序保證可以根據(jù)該消息隊(duì)列的元數(shù)據(jù)“是否保序”的值來判斷,值為是則表示需要順序保證,為否則表示不需要順序保證。進(jìn)ー步地,消息隊(duì)列的是否保序的值可以由消息隊(duì)列管理単元根據(jù)分布式程序的命令消息進(jìn)行設(shè)置,分布式程序可以是消息傳遞中發(fā)送消息數(shù)據(jù)的第一分布式程序也可以是接收消息數(shù)據(jù)的第二分布式程序。例如,第一分布式程序發(fā)送包含需要保序指示的參數(shù)的命令消息,由消息隊(duì)列管理單元將消息隊(duì)列的是否保序的值設(shè)為是。也可以由消息隊(duì)列管理模塊根據(jù)第二分布式程序讀取消息數(shù)據(jù)的請(qǐng)求或者第一分布式程序發(fā)送消息數(shù)據(jù)的消息攜帯的參數(shù)進(jìn)行設(shè)置,例如在第二分布式程序讀取消息數(shù)據(jù)的請(qǐng)求中包含參數(shù)指示消息傳遞需要保序,則消息隊(duì)列管理單元將消息隊(duì)列是否保序的值置為是。此外,消息隊(duì)列管理単元判斷第二分布式程序是否需要消息傳遞的順序保證也可以根據(jù)第二分布式程序在讀取消息數(shù)據(jù)的請(qǐng)求中包含的指示是否保序的參數(shù),當(dāng)指示保序則表示需要順序保證,指示不保序則表示不需要順序保證。在本發(fā)明實(shí)施例中,進(jìn)ー步地,接收單元接收到第二分布式程序讀取消息數(shù)據(jù)的請(qǐng)求,消息隊(duì)列管理単元會(huì)先確定該消息隊(duì)列中是否有原未讀取成功被跳過的未讀消息數(shù)據(jù),具體可以通過判斷該消息隊(duì)列的元數(shù)據(jù)“未讀取成功消息序列號(hào)”是否為空。如有未讀取成功的消息數(shù)據(jù),則通知存儲(chǔ)單元讀取該消息數(shù)據(jù)。具體的實(shí)施方式可以為,消息隊(duì)列管理單元從未讀取成功消息序列號(hào)中獲取ー個(gè)消息序列號(hào),采用該消息序列號(hào)生成鍵值Key,通知存儲(chǔ)單元在分布式Key-Value存儲(chǔ)系統(tǒng)中讀取消息數(shù)據(jù),如果讀取成功則由接ロ単元將讀取的消息數(shù)據(jù)傳遞給第二分布式程序,并由消息隊(duì)列管理単元在該消息隊(duì)列的未讀取成功消息序列號(hào)中刪除本次已讀取成功的消息序列號(hào)。如讀取不成功,則消息隊(duì)列管理單元繼續(xù)從該消息隊(duì)列的未讀取成功消息序列號(hào)中獲取下ー個(gè)消息序列號(hào),直至讀取消息數(shù)據(jù)成功或未讀取成功消息序列號(hào)中已沒有新的消息序列號(hào)可以進(jìn)行消息數(shù)據(jù)讀取。如該消息隊(duì)列的未讀取成功消息序列號(hào)為空或未讀取成功消息序列號(hào)中所有消息序列號(hào)對(duì)應(yīng)的消息數(shù)據(jù)均讀取不成功,則消息隊(duì)列管理単元通知存儲(chǔ)單元獲取消息隊(duì)列的接收消息序列號(hào)對(duì)應(yīng)的消息數(shù)據(jù)。
本發(fā)明實(shí)施例中鍵值Key至少要包含消息隊(duì)列標(biāo)識(shí)、消息序列號(hào),具體格式可以為消息隊(duì)列標(biāo)識(shí)+消息序列號(hào),或?yàn)橄⑿蛄刑?hào)+消息隊(duì)列標(biāo)識(shí),并可根據(jù)業(yè)務(wù)需要添加其他信息,如消息長度等,在分布式Key-Value存儲(chǔ)系統(tǒng)中存儲(chǔ)第一分布式模塊發(fā)送的消息數(shù)據(jù)與讀取消息數(shù)據(jù)給第二分布式程序時(shí)生成鍵值Key的格式應(yīng)相同。鍵值Key可以由消息隊(duì)列管理單元生成后,然后通知存儲(chǔ)單元根據(jù)Key在分布式Key-Value存儲(chǔ)系統(tǒng)中存儲(chǔ)或讀取消息數(shù)據(jù)。消息隊(duì)列管理単元也可以僅傳遞消息隊(duì)列的消息隊(duì)列標(biāo)識(shí)、消息序列號(hào)等信息給存儲(chǔ)単元,由存儲(chǔ)單元生成鍵值Key,在分布式Key-Value存儲(chǔ)系統(tǒng)中存儲(chǔ)或讀取消息數(shù)據(jù)。當(dāng)然,本實(shí)施例中消息隊(duì)列的發(fā)送消息序列號(hào)和接收消息序列號(hào)均會(huì)定義ー個(gè)最大值,消息序列號(hào)超過定義的最大值,則消息序列號(hào)會(huì)進(jìn)行反轉(zhuǎn),即重新從初始值開始計(jì)數(shù)。消息隊(duì)列管理單元對(duì)消息序列號(hào)進(jìn)行遞增處理時(shí),如果達(dá)到了消息序列號(hào)的最大值,則將消息序列號(hào)進(jìn)行反轉(zhuǎn)處理。本實(shí)施例中存儲(chǔ)單元還可以進(jìn)ー步地包括關(guān)系型數(shù)據(jù)庫,并優(yōu)選地將消息隊(duì)列的元數(shù)據(jù)存儲(chǔ)在關(guān)系型數(shù)據(jù)庫中,也可以以消息隊(duì)列標(biāo)識(shí)作為鍵值Key,元數(shù)據(jù)作為Value存儲(chǔ)在分布式Key-Value存儲(chǔ)系統(tǒng)中。存儲(chǔ)單元也會(huì)相應(yīng)地在關(guān)系型數(shù)據(jù)庫或分布式Key-Value存儲(chǔ)系統(tǒng)中讀取或修改消息隊(duì)列的元數(shù)據(jù)。上述元數(shù)據(jù)中至少包含消息隊(duì)列標(biāo)識(shí)、發(fā)送消息序列號(hào)、接收消息序列號(hào)、是否保序、未讀取成功消息序列號(hào)等信息中的ー種或幾種。本實(shí)施例中的分布式Key-Value存儲(chǔ)系統(tǒng)和關(guān)系型數(shù)據(jù)庫,作為存儲(chǔ)單元的一部分,在物理上可以和云消息服務(wù)設(shè)備的其他部分在一起,也可以分布在多個(gè)網(wǎng)絡(luò)物理實(shí)體上。因此,本發(fā)明實(shí)施例的云消息服務(wù)設(shè)備在第一分布式程序發(fā)送消息時(shí),在分布式Key-Value存儲(chǔ)系統(tǒng)中存儲(chǔ)該消息攜帯的消息數(shù)據(jù),并遞增修改消息隊(duì)列的發(fā)送消息序列號(hào);在第二分布式程序請(qǐng)求接收消息數(shù)據(jù)時(shí),根據(jù)消息隊(duì)列的接收消息序列號(hào)讀取消息數(shù)據(jù),并遞增修改消息隊(duì)列的接收消息序列號(hào),實(shí)現(xiàn)了云消息服務(wù)的消息傳遞的順序保證。并進(jìn)ー步地,當(dāng)讀取消息數(shù)據(jù)失敗時(shí),根據(jù)分布式程序是否需要順序保證的需求確定是否繼續(xù)讀取該消息數(shù)據(jù)直至讀取成功,或者繼續(xù)讀取下一個(gè)接收消息序列號(hào)的消息數(shù)據(jù),同時(shí)將未讀取成功的消息序列號(hào)記錄下來,在后續(xù)分布式程序請(qǐng)求讀取消息數(shù)據(jù)時(shí)再進(jìn)行讀取,從而實(shí)現(xiàn)了根據(jù)分布式程序的設(shè)置確定是否需要云消息服務(wù)提供嚴(yán)格的順序保證。并進(jìn)ー步地,通過在關(guān)系型數(shù)據(jù)庫中存儲(chǔ)和修改消息隊(duì)列的元數(shù)據(jù),提供了嚴(yán)格一次的分發(fā)保證能力,從而保障了消息傳遞的順序保證及分發(fā)保證。
本領(lǐng)域普通技術(shù)人員可以意識(shí)到,結(jié)合本文中所公開的實(shí)施例描述的各示例的單元及算法步驟,能夠以電子硬件、計(jì)算機(jī)軟件或者二者的結(jié)合來實(shí)現(xiàn),為了清楚地說明硬件和軟件的可互換性,在上述說明中已經(jīng)按照功能一般性地描述了各示例的組成及步驟。這些功能究竟以硬件還是軟件方式來執(zhí)行,取決于技術(shù)方案的特定應(yīng)用和設(shè)計(jì)約束條件。專業(yè)技術(shù)人員可以對(duì)每個(gè)特定的應(yīng)用來使用不同方法來實(shí)現(xiàn)所描述的功能,但是這種實(shí)現(xiàn)不應(yīng)認(rèn)為超出本發(fā)明的范圍。所屬領(lǐng)域的技術(shù)人員可以清楚地了解到,為描述的方便和簡潔,上述描述的系統(tǒng)、裝置和単元的具體工作過程,可以參考前述方法實(shí)施例中的對(duì)應(yīng)過程,在此不再贅述。在本申請(qǐng)所提供的幾個(gè)實(shí)施例中,應(yīng)該理解到,所揭露的系統(tǒng)、裝置和方法,可以通過其它的方式實(shí)現(xiàn)。例如,以上所描述的裝置實(shí)施例僅僅是示意性的,例如,所述單元的劃分,僅僅為一種邏輯功能劃分,實(shí)際實(shí)現(xiàn)時(shí)可以有另外的劃分方式,例如多個(gè)單元或組件可以結(jié)合或者可以集成到另ー個(gè)系統(tǒng),或一些特征可以忽略,或不執(zhí)行。另一點(diǎn),所顯示或討論的相互之間的耦合或直接耦合或通信連接可以是通過ー些接ロ,裝置或単元的間接耦 合或通信連接,可以是電性,機(jī)械或其它的形式。所述作為分離部件說明的単元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理単元,即可以位于ー個(gè)地方,或者也可以分布到多個(gè)網(wǎng)絡(luò)單元上??梢愿鶕?jù)實(shí)際的需要選擇其中的部分或者全部單元來實(shí)現(xiàn)本實(shí)施例方案的目的。另外,在本發(fā)明各個(gè)實(shí)施例中的各功能単元可以集成在一個(gè)處理単元中,也可以是各個(gè)單元單獨(dú)物理存在,也可以兩個(gè)或兩個(gè)以上單元集成在一個(gè)單元中。上述集成的單元既可以采用硬件的形式實(shí)現(xiàn),也可以采用軟件功能単元的形式實(shí)現(xiàn)。所述集成的単元如果以軟件功能単元的形式實(shí)現(xiàn)并作為獨(dú)立的產(chǎn)品銷售或使用時(shí),可以存儲(chǔ)在一個(gè)計(jì)算機(jī)可讀取存儲(chǔ)介質(zhì)中?;谶@樣的理解,本發(fā)明的技術(shù)方案本質(zhì)上或者說對(duì)現(xiàn)有技術(shù)做出貢獻(xiàn)的部分或者該技術(shù)方案的全部或部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計(jì)算機(jī)軟件產(chǎn)品存儲(chǔ)在ー個(gè)存儲(chǔ)介質(zhì)中,包括若干指令用以使得一臺(tái)計(jì)算機(jī)設(shè)備(可以是個(gè)人計(jì)算機(jī),服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本發(fā)明各個(gè)實(shí)施例所述方法的全部或部分步驟。而前述的存儲(chǔ)介質(zhì)包括U盤、移動(dòng)硬盤、只讀存儲(chǔ)器(ROM,Read-OnlyMemory)、隨機(jī)存取存儲(chǔ)器(RAM, Random Access Memory)、磁碟或者光盤等各種可以存儲(chǔ)程序代碼的介質(zhì)。以上所述,僅為本發(fā)明的具體實(shí)施方式
,但本發(fā)明的保護(hù)范圍并不局限于此,任何熟悉本技術(shù)領(lǐng)域的技術(shù)人員在本發(fā)明揭露的技術(shù)范圍內(nèi),可輕易想到變化或替換,都應(yīng)涵蓋在本發(fā)明的保護(hù)范圍之內(nèi)。因此,本發(fā)明的保護(hù)范圍應(yīng)所述以權(quán)利要求的保護(hù)范圍為準(zhǔn)。
權(quán)利要求
1.ー種云消息服務(wù)中實(shí)現(xiàn)消息傳遞的方法,其特征在于,包括, 接收第一分布式程序發(fā)送的消息,在分布式Key-Value存儲(chǔ)系統(tǒng)中存儲(chǔ)所述消息攜帶的消息數(shù)據(jù),并遞增所述消息對(duì)應(yīng)的消息隊(duì)列的發(fā)送消息序列號(hào); 接收第二分布式程序讀取消息數(shù)據(jù)的請(qǐng)求,在所述分布式Key-Value存儲(chǔ)系統(tǒng)中讀取所述消息數(shù)據(jù),將讀取的所述消息數(shù)據(jù)發(fā)送給所述第二分布式程序,并在所述消息數(shù)據(jù)為所述消息隊(duì)列的接收消息序列號(hào)對(duì)應(yīng)的消息數(shù)據(jù)時(shí),遞增所述消息隊(duì)列的接收消息序列號(hào)。
2.如權(quán)利要求I所述的方法,其特征在于,所述在分布式Key-Value存儲(chǔ)系統(tǒng)中存儲(chǔ)所述消息攜帯的消息數(shù)據(jù),包括生成包含所述發(fā)送消息序列號(hào)的鍵值Key,按照所述鍵值Key在所述分布式Key-Value存儲(chǔ)系統(tǒng)中存儲(chǔ)所述消息攜帶的消息數(shù)據(jù)。
3.如權(quán)利要求1-2任一所述的方法,其特征在于,所述在所述分布式Key-Value存儲(chǔ)系統(tǒng)中讀取所述消息數(shù)據(jù),包括生成包含所述接收消息序列號(hào)的鍵值Key,按照所述鍵值Key在所述分布式Key-Value存儲(chǔ)系統(tǒng)中讀取所述消息數(shù)據(jù)。
4.如權(quán)利要求1-3任一所述的方法,其特征在于,所述發(fā)送消息序列號(hào)和接收消息序列號(hào)存儲(chǔ)在關(guān)系型數(shù)據(jù)庫中。
5.如權(quán)利要求1-4任一所述的方法,其特征在于,所述消息隊(duì)列的發(fā)送消息序列號(hào)和接收消息序列號(hào)初始值相同。
6.如權(quán)利要求1-5任一所述的方法,其特征在干,當(dāng)遞增所述消息隊(duì)列的發(fā)送消息序列號(hào)時(shí),若所述發(fā)送消息序列號(hào)超過消息序列號(hào)的最大值,則將所述發(fā)送消息序列號(hào)重新置為初始值;或 當(dāng)遞增所述消息隊(duì)列的接收消息序列號(hào)時(shí),若所述接收消息序列號(hào)超過消息序列號(hào)的最大值,則將所述接收消息序列號(hào)重新置為初始值。
7.如權(quán)利要求1-6任一所述的方法,其特征在于,如果所述讀取消息數(shù)據(jù)的請(qǐng)求對(duì)應(yīng)的消息隊(duì)列的接收消息序列號(hào)不等于發(fā)送消息序列號(hào),或者所述讀取消息數(shù)據(jù)的請(qǐng)求對(duì)應(yīng)的消息隊(duì)列中有未讀取成功的消息數(shù)據(jù)時(shí),則在所述分布式Key-Value存儲(chǔ)系統(tǒng)中讀取消息數(shù)據(jù)。
8.如權(quán)利要求7所述的方法,其特征在干,當(dāng)所述消息隊(duì)列的未讀取成功消息序列號(hào)不為空,則所述消息隊(duì)列中有未讀取成功的消息數(shù)據(jù)。
9.如權(quán)利要求1-8任一所述的方法,其特征在于,如果在所述分布式Key-Value存儲(chǔ)系統(tǒng)中讀取消息數(shù)據(jù)不成功,則判斷所述第二分布式程序的消息傳遞是否需要順序保證,如果需要順序保證,則繼續(xù)讀取所述未讀取成功的消息數(shù)據(jù),直到成功讀取所述消息數(shù)據(jù);如果不需要順序保證,則在所述消息隊(duì)列的未讀取成功消息序列號(hào)中記錄所述未讀取成功的消息數(shù)據(jù)對(duì)應(yīng)的消息序列號(hào),并遞增所述消息隊(duì)列的接收消息序列號(hào),繼續(xù)讀取下ー個(gè)消息數(shù)據(jù)。
10.如權(quán)利要求9所述的方法,其特征在于,根據(jù)所述消息隊(duì)列的是否保序的值或所述第二分布式程序讀取消息數(shù)據(jù)的請(qǐng)求中的參數(shù)判斷所述第二分布式程序的消息傳遞是否需要順序保證。
11.如權(quán)利要求10所述的方法,其特征在于,所述消息隊(duì)列的是否保序的值由所述第一分布式程序或所述第二分布式程序通過消息設(shè)置。
12.如權(quán)利要求7-11任一所述的方法,其特征在于,所述讀取消息數(shù)據(jù)的請(qǐng)求對(duì)應(yīng)的消息隊(duì)列中有未讀取成功的消息數(shù)據(jù)時(shí),在所述分布式Key-Value存儲(chǔ)系統(tǒng)中讀取消息數(shù)據(jù),具體為 從所述讀取消息數(shù)據(jù)的請(qǐng)求對(duì)應(yīng)的消息隊(duì)列的未讀取成功消息序列號(hào)中獲取ー個(gè)消息序列號(hào),生成包含所述消息序列號(hào)的鍵值Key,按照所述鍵值Key在所述分布式Key-Value存儲(chǔ)系統(tǒng)中讀取所述消息數(shù)據(jù),如讀取成功,從所述消息隊(duì)列的未讀取成功消息序列號(hào)中刪除所述消息序列號(hào)。
13.—種云消息服務(wù)設(shè)備,其特征在于,包括 接ロ単元,用于接收第一分布式程序發(fā)送的消息;接收第二分布式程序讀取消息數(shù)據(jù)的請(qǐng)求,以及將存儲(chǔ)單元讀取的所述消息數(shù)據(jù)發(fā)送給所述第二分布式程序; 消息隊(duì)列管理単元,用于通知存儲(chǔ)單元存儲(chǔ)所述接ロ単元接收的所述消息攜帯的消息數(shù)據(jù),并遞增所述消息對(duì)應(yīng)的消息隊(duì)列的發(fā)送消息序列號(hào);根據(jù)所述接ロ単元接收的所述讀取消息數(shù)據(jù)的請(qǐng)求,通知所述存儲(chǔ)單元讀取所述消息數(shù)據(jù),并在讀取所述消息隊(duì)列的接收消息序列號(hào)對(duì)應(yīng)的消息數(shù)據(jù)成功時(shí),遞增所述消息隊(duì)列的接收消息序列號(hào); 所述存儲(chǔ)単元,包括分布式Key-Value存儲(chǔ)系統(tǒng),用于進(jìn)行所述消息數(shù)據(jù)的存儲(chǔ)或讀取。
14.如權(quán)利要求13所述的云消息服務(wù)設(shè)備,其特征在于,所述通知存儲(chǔ)單元存儲(chǔ)所述接ロ単元接收的所述消息攜帯的消息數(shù)據(jù),包括 生成包含所述消息對(duì)應(yīng)的消息隊(duì)列的發(fā)送消息序列號(hào)的鍵值Key,通知所述存儲(chǔ)単元按照所述鍵值Key在所述分布式Key-Value存儲(chǔ)系統(tǒng)中存儲(chǔ)所述接ロ單元接收的所述消息攜帯的消息數(shù)據(jù);或者, 通知所述存儲(chǔ)単元生成包含所述消息對(duì)應(yīng)的消息隊(duì)列的發(fā)送消息序列號(hào)的鍵值Key,按照所述鍵值Key在所述分布式Key-Value存儲(chǔ)系統(tǒng)中存儲(chǔ)所述接ロ單元接收的所述消息攜帯的消息數(shù)據(jù)。
15.如權(quán)利要求13-14任一所述的云消息服務(wù)設(shè)備,其特征在于,所述通知所述存儲(chǔ)單元讀取所述消息數(shù)據(jù),包括 生成包含所述讀取消息數(shù)據(jù)的請(qǐng)求對(duì)應(yīng)的消息隊(duì)列的接收消息序列號(hào)的鍵值Key,通知所述存儲(chǔ)單元按照所述鍵值Key在所述分布式Key-Value存儲(chǔ)系統(tǒng)中讀取消息數(shù)據(jù);或者, 通知所述存儲(chǔ)単元生成包含所述讀取消息數(shù)據(jù)的請(qǐng)求對(duì)應(yīng)的消息隊(duì)列的接收消息序列號(hào)的鍵值Key,按照所述鍵值Key在所述分布式Key-Value存儲(chǔ)系統(tǒng)中讀取所述消息數(shù)據(jù)。
16.如權(quán)利要求13-15任一所述的云消息服務(wù)設(shè)備,其特征在于,所述存儲(chǔ)単元將所述消息隊(duì)列的發(fā)送消息序列號(hào)和接收消息序列號(hào)存儲(chǔ)在關(guān)系型數(shù)據(jù)庫中。
17.如權(quán)利要求13-16任一所述的云消息服務(wù)設(shè)備,其特征在于,所述消息隊(duì)列的發(fā)送消息序列號(hào)和接收消息序列號(hào)初始值相同。
18.如權(quán)利要求13-17任一所述的云消息服務(wù)設(shè)備,其特征在于,所述遞增消息隊(duì)列的發(fā)送消息序列號(hào),當(dāng)所述發(fā)送消息序列號(hào)超過消息序列號(hào)的最大值時(shí),則所述發(fā)送消息序列號(hào)重新置為初始值;或所述遞增所述消息隊(duì)列的接收消息序列號(hào),當(dāng)所述接收消息序列號(hào)超過消息序列號(hào)的最大值時(shí),所述接收消息序列號(hào)重新置為初始值。
19.如權(quán)利要求13-18任一所述的云消息服務(wù)設(shè)備,其特征在于,如果所述讀取消息數(shù)據(jù)的請(qǐng)求對(duì)應(yīng)的消息隊(duì)列的接收消息序列號(hào)不等于發(fā)送消息序列號(hào),或者所述讀取消息數(shù)據(jù)的請(qǐng)求對(duì)應(yīng)的消息隊(duì)列中有未讀取成功的消息數(shù)據(jù)時(shí),消息隊(duì)列管理単元通知所述存儲(chǔ)單元讀取所述消息數(shù)據(jù)。
20.如權(quán)利要求19所述的云消息服務(wù)設(shè)備,其特征在干,當(dāng)所述消息隊(duì)列的未讀取成功消息序列號(hào)不為空,則所述消息隊(duì)列中有未讀取成功的消息數(shù)據(jù)。
21.如權(quán)利要求13-20任一所述的云消息服務(wù)設(shè)備,其特征在于,如果所述存儲(chǔ)單元在所述分布式Key-Value存儲(chǔ)系統(tǒng)中讀取消息數(shù)據(jù)不成功,則所述消息隊(duì)列管理単元判斷所述第二分布式程序的消息傳遞是否需要順序保證,如果需要順序保證,則通知所述存儲(chǔ)單元繼續(xù)讀取所述未讀取成功的消息數(shù)據(jù),直到成功讀取所述消息數(shù)據(jù);如果不需要順序保證,則所述消息隊(duì)列管理単元在所述消息隊(duì)列的未讀取成功消息序列號(hào)中記錄所述未讀取成功的消息數(shù)據(jù)對(duì)應(yīng)的消息序列號(hào),并遞增所述消息隊(duì)列的接收消息序列號(hào),通知所述存儲(chǔ)單元繼續(xù)讀取下ー個(gè)消息數(shù)據(jù)。
22.如權(quán)利要求21所述的云消息服務(wù)設(shè)備,其特征在于,所述消息隊(duì)列管理単元根據(jù)所述消息隊(duì)列的是否保序的值或所述第二分布式程序讀取消息數(shù)據(jù)的請(qǐng)求中包含的參數(shù)判斷所述第二分布式程序的消息傳遞是否需要順序保證。
23.如權(quán)利要求22任一所述的云消息服務(wù)設(shè)備,其特征在于,所述消息隊(duì)列的是否保序的值由所述消息隊(duì)列管理単元根據(jù)所述第一分布式程序或所述第二分布式程序的消息進(jìn)行設(shè)置。
24.如權(quán)利要求19-23任一所述的云消息服務(wù)設(shè)備,其特征在于,所述消息隊(duì)列中有未讀取成功的消息數(shù)據(jù)時(shí),通知所述存儲(chǔ)單元讀取所述消息數(shù)據(jù),具體為 所述消息隊(duì)列管理単元從所述消息隊(duì)列的未讀取成功消息序列號(hào)中獲取ー個(gè)消息序列號(hào),生成包含所述消息序列號(hào)的鍵值Key,通知所述存儲(chǔ)單元按照所述鍵值Key在所述分布式Key-Value存儲(chǔ)系統(tǒng)中讀取所述消息數(shù)據(jù),如讀取成功,所述消息隊(duì)列管理從所述消息隊(duì)列的所述未讀取成功消息序列號(hào)中刪除所述消息序列號(hào)。
全文摘要
本發(fā)明實(shí)施例提供一種云消息服務(wù)中實(shí)現(xiàn)消息傳遞的方法和設(shè)備,該方法包括接收第一分布式程序發(fā)送的消息,在分布式Key-Value存儲(chǔ)系統(tǒng)中存儲(chǔ)所述消息攜帶的消息數(shù)據(jù),并遞增所述消息對(duì)應(yīng)的消息隊(duì)列的發(fā)送消息序列號(hào);接收第二分布式程序讀取消息數(shù)據(jù)的請(qǐng)求,在所述分布式Key-Value存儲(chǔ)系統(tǒng)中讀取所述消息數(shù)據(jù),將讀取的所述消息數(shù)據(jù)發(fā)送給所述第二分布式程序,并在所述消息數(shù)據(jù)為所述消息隊(duì)列的接收消息序列號(hào)對(duì)應(yīng)的消息數(shù)據(jù)時(shí),遞增所述消息隊(duì)列的接收消息序列號(hào)。本發(fā)明實(shí)施例通過為消息隊(duì)列設(shè)置發(fā)送消息序列號(hào)和接收消息序列號(hào),當(dāng)?shù)谝环植际匠绦虬l(fā)送消息數(shù)據(jù)時(shí),云消息服務(wù)設(shè)備按照消息隊(duì)列的發(fā)送消息序列號(hào)在分布式Key-Value存儲(chǔ)系統(tǒng)中存儲(chǔ)接收到的消息數(shù)據(jù),并遞增修改發(fā)送消息序列號(hào);當(dāng)?shù)诙植际匠绦蛘?qǐng)求接收消息數(shù)據(jù)時(shí),云消息服務(wù)設(shè)備按照消息隊(duì)列的接收消息序列號(hào)讀取消息數(shù)據(jù),并遞增修改接收消息序列號(hào)。從而實(shí)現(xiàn)了云消息服務(wù)的高可用性和伸縮性要求,同時(shí)又保障了消息傳遞的順序保證。
文檔編號(hào)H04L12/58GK102668516SQ201180003087
公開日2012年9月12日 申請(qǐng)日期2011年12月2日 優(yōu)先權(quán)日2011年12月2日
發(fā)明者樊榮, 趙軍, 鄧金波 申請(qǐng)人:華為技術(shù)有限公司