本發(fā)明涉及通信技術(shù)領(lǐng)域,具體涉及一種消息隊(duì)列的消費(fèi)方法及裝置。
背景技術(shù):
目前,當(dāng)業(yè)務(wù)前端生產(chǎn)者產(chǎn)生消息之后,通常是將待處理的消息存儲(chǔ)于消息隊(duì)列的消息分區(qū)中,然后交由后端的消費(fèi)端進(jìn)行處理。在現(xiàn)有技術(shù)中,每當(dāng)消費(fèi)端的消費(fèi)任務(wù)啟動(dòng)時(shí),默認(rèn)根據(jù)之前記錄的當(dāng)前數(shù)據(jù)偏移進(jìn)行消費(fèi)。
但是,發(fā)明人在實(shí)現(xiàn)本發(fā)明的過(guò)程中發(fā)現(xiàn),現(xiàn)有技術(shù)中的上述方式至少存在下述缺陷:由于消息隊(duì)列中存儲(chǔ)的消息數(shù)據(jù)會(huì)定期進(jìn)行刪除,一旦之前記錄的當(dāng)前數(shù)據(jù)偏移所對(duì)應(yīng)位置的消息已被刪除,則會(huì)導(dǎo)致消費(fèi)失敗現(xiàn)象,由此會(huì)影響整個(gè)數(shù)據(jù)處理系統(tǒng)的正常運(yùn)行。
技術(shù)實(shí)現(xiàn)要素:
鑒于上述問(wèn)題,提出了本發(fā)明以便提供一種克服上述問(wèn)題或者至少部分地解決上述問(wèn)題的消息隊(duì)列的消費(fèi)方法及裝置。
根據(jù)本發(fā)明的一個(gè)方面,提供了一種消息對(duì)列的消費(fèi)方法,包括:當(dāng)消費(fèi)任務(wù)啟動(dòng)時(shí),獲取所述消費(fèi)任務(wù)對(duì)應(yīng)的消息隊(duì)列的最舊數(shù)據(jù)偏移;將所述消息隊(duì)列的最舊數(shù)據(jù)偏移與預(yù)先存儲(chǔ)的該消息隊(duì)列的當(dāng)前數(shù)據(jù)偏移進(jìn)行比較;當(dāng)所述最舊數(shù)據(jù)偏移小于所述當(dāng)前數(shù)據(jù)偏移時(shí),根據(jù)所述當(dāng)前數(shù)據(jù)偏移讀取該消息隊(duì)列中的消息數(shù)據(jù);每當(dāng)從所述消息隊(duì)列中讀取一條消息數(shù)據(jù)后,根據(jù)該條消息數(shù)據(jù)對(duì)應(yīng)的偏移地址更新所述預(yù)先存儲(chǔ)的該消息隊(duì)列的當(dāng)前數(shù)據(jù)偏移。
可選地,當(dāng)所述最舊數(shù)據(jù)偏移不小于所述當(dāng)前數(shù)據(jù)偏移時(shí),根據(jù)所述最舊數(shù)據(jù)偏移讀取該消息隊(duì)列中的消息數(shù)據(jù)。
可選地,所述消息隊(duì)列具有多個(gè)消息分區(qū),且所述預(yù)先存儲(chǔ)的該消息隊(duì)列的當(dāng)前數(shù)據(jù)偏移包括:該消息隊(duì)列的各個(gè)消息分區(qū)的當(dāng)前數(shù)據(jù)偏移;所述獲取所述消息隊(duì)列的最舊數(shù)據(jù)偏移具體為:分別獲取所述消息隊(duì)列的各個(gè)消息分區(qū)的最舊數(shù)據(jù)偏移;所述將所述消息隊(duì)列的最舊數(shù)據(jù)偏移與預(yù)先存儲(chǔ)的該消息隊(duì)列的當(dāng)前數(shù)據(jù)偏移進(jìn)行比較的步驟具體為:分別將所述消息隊(duì)列的各個(gè)消息分區(qū)的最舊數(shù)據(jù)偏移與預(yù)先存儲(chǔ)的該消息隊(duì)列相應(yīng)的消息分區(qū)的當(dāng)前數(shù)據(jù)偏移進(jìn)行比較;所述根據(jù)該條消息數(shù)據(jù)對(duì)應(yīng)的偏移地址更新所述存儲(chǔ)的該消息隊(duì)列的當(dāng)前數(shù)據(jù)偏移的步驟具體為:根據(jù)該條消息數(shù)據(jù)對(duì)應(yīng)的偏移地址更新該消息隊(duì)列相應(yīng)的消息分區(qū)的當(dāng)前數(shù)據(jù)偏移。
可選地,所述根據(jù)該條消息數(shù)據(jù)對(duì)應(yīng)的偏移地址更新所述預(yù)先存儲(chǔ)的該消息隊(duì)列的當(dāng)前數(shù)據(jù)偏移的步驟具體包括:創(chuàng)建用于更新當(dāng)前數(shù)據(jù)偏移的事務(wù),該事務(wù)包括:用于寫(xiě)入該條消息數(shù)據(jù)對(duì)應(yīng)的偏移地址的第一操作,以及用于寫(xiě)入該條消息數(shù)據(jù)的數(shù)據(jù)內(nèi)容的第二操作;當(dāng)該事務(wù)中包含的第一操作和第二操作都執(zhí)行成功時(shí),向后臺(tái)數(shù)據(jù)庫(kù)提交該事務(wù);當(dāng)該事務(wù)中包含的第一操作和/或第二操作執(zhí)行失敗時(shí),回滾該事務(wù)。
可選地,所述獲取所述消息隊(duì)列的最舊數(shù)據(jù)偏移的步驟具體包括:與用于維護(hù)所述消息隊(duì)列的隊(duì)列服務(wù)器之間建立通信連接,通過(guò)所述通信連接獲取所述消息隊(duì)列的最舊數(shù)據(jù)偏移。
可選地,所述消息隊(duì)列為分布式消息隊(duì)列。
依據(jù)本發(fā)明的另一方面,提供了一種消息對(duì)列的消費(fèi)裝置,包括:獲取模塊,適于當(dāng)消費(fèi)任務(wù)啟動(dòng)時(shí),獲取所述消費(fèi)任務(wù)對(duì)應(yīng)的消息隊(duì)列的最舊數(shù)據(jù)偏移;比較模塊,適于將所述消息隊(duì)列的最舊數(shù)據(jù)偏移與預(yù)先存儲(chǔ)的該消息隊(duì)列的當(dāng)前數(shù)據(jù)偏移進(jìn)行比較;讀取模塊,適于當(dāng)所述最舊數(shù)據(jù)偏移小于所述當(dāng)前數(shù)據(jù)偏移時(shí),根據(jù)所述當(dāng)前數(shù)據(jù)偏移讀取該消息隊(duì)列中的消息數(shù)據(jù);更新模塊,適于每當(dāng)從所述消息隊(duì)列中讀取一條消息數(shù)據(jù)后,根據(jù)該條消息數(shù)據(jù)對(duì)應(yīng)的偏移地址更新所述預(yù)先存儲(chǔ)的該消息隊(duì)列的當(dāng)前數(shù)據(jù)偏移。
可選地,所述讀取模塊進(jìn)一步適于:當(dāng)所述最舊數(shù)據(jù)偏移不小于所述當(dāng)前數(shù)據(jù)偏移時(shí),根據(jù)所述最舊數(shù)據(jù)偏移讀取該消息隊(duì)列中的消息數(shù)據(jù)。
可選地,所述消息隊(duì)列具有多個(gè)消息分區(qū),且所述預(yù)先存儲(chǔ)的該消息隊(duì)列的當(dāng)前數(shù)據(jù)偏移包括:該消息隊(duì)列的各個(gè)消息分區(qū)的當(dāng)前數(shù)據(jù)偏移;所述獲取模塊具體適于:分別獲取所述消息隊(duì)列的各個(gè)消息分區(qū)的最舊數(shù)據(jù)偏移;所述比較模塊具體適于:分別將所述消息隊(duì)列的各個(gè)消息分區(qū)的最舊數(shù)據(jù)偏移與預(yù)先存儲(chǔ)的該消息隊(duì)列相應(yīng)的消息分區(qū)的當(dāng)前數(shù)據(jù)偏移進(jìn)行比較;所述更新模塊具體適于:根據(jù)該條消息數(shù)據(jù)對(duì)應(yīng)的偏移地址更新該消息隊(duì)列相應(yīng)的消息分區(qū)的當(dāng)前數(shù)據(jù)偏移。
可選地,所述更新模塊具體適于:創(chuàng)建用于更新當(dāng)前數(shù)據(jù)偏移的事務(wù),該事務(wù)包括:用于寫(xiě)入該條消息數(shù)據(jù)對(duì)應(yīng)的偏移地址的第一操作,以及用于寫(xiě)入該條消息數(shù)據(jù)的數(shù)據(jù)內(nèi)容的第二操作;當(dāng)該事務(wù)中包含的第一操作和第二操作都執(zhí)行成功時(shí),向后臺(tái)數(shù)據(jù)庫(kù)提交該事務(wù);當(dāng)該事務(wù)中包含的第一操作和/或第二操作執(zhí)行失敗時(shí),回滾該事務(wù)。
可選地,所述獲取模塊具體適于:與用于維護(hù)所述消息隊(duì)列的隊(duì)列服務(wù)器之間建立通信連接,通過(guò)所述通信連接獲取所述消息隊(duì)列的最舊數(shù)據(jù)偏移。
可選地,所述消息隊(duì)列為分布式消息隊(duì)列。
在本發(fā)明提供的一種消息隊(duì)列的消費(fèi)方法及裝置中,每當(dāng)消費(fèi)任務(wù)啟動(dòng)時(shí),能夠獲取到該消費(fèi)任務(wù)對(duì)應(yīng)的消息隊(duì)列的最舊數(shù)據(jù)偏移,并將該消息隊(duì)列的最舊數(shù)據(jù)偏移與預(yù)先存儲(chǔ)的該消息隊(duì)列的當(dāng)前數(shù)據(jù)偏移進(jìn)行比較,只有在最舊數(shù)據(jù)偏移小于當(dāng)前數(shù)據(jù)偏移時(shí),才根據(jù)當(dāng)前數(shù)據(jù)偏移讀取該消息隊(duì)列中的消息數(shù)據(jù)。由此可見(jiàn),本申請(qǐng)中的方式能夠判斷出當(dāng)前數(shù)據(jù)偏移所對(duì)應(yīng)位置的消息是否已被刪除,從而避免了消費(fèi)失敗的現(xiàn)象,提升了整個(gè)數(shù)據(jù)處理系統(tǒng)的可靠性。
上述說(shuō)明僅是本發(fā)明技術(shù)方案的概述,為了能夠更清楚了解本發(fā)明的技術(shù)手段,而可依照說(shuō)明書(shū)的內(nèi)容予以實(shí)施,并且為了讓本發(fā)明的上述和其它目的、特征和優(yōu)點(diǎn)能夠更明顯易懂,以下特舉本發(fā)明的具體實(shí)施方式。
附圖說(shuō)明
通過(guò)閱讀下文優(yōu)選實(shí)施方式的詳細(xì)描述,各種其他的優(yōu)點(diǎn)和益處對(duì)于本領(lǐng)域普通技術(shù)人員將變得清楚明了。附圖僅用于示出優(yōu)選實(shí)施方式的目的,而并不認(rèn)為是對(duì)本發(fā)明的限制。而且在整個(gè)附圖中,用相同的參考符號(hào)表示相同的部件。在附圖中:
圖1示出了本發(fā)明實(shí)施例一提供的一種消息隊(duì)列的消費(fèi)方法的流程示意圖;
圖2示出了本發(fā)明實(shí)施例二提供的一種消息隊(duì)列的消費(fèi)方法的流程示意圖;
圖3示出了本發(fā)明實(shí)施例三提供的一種消息隊(duì)列的消費(fèi)裝置的結(jié)構(gòu)示意圖。
具體實(shí)施方式
下面將參照附圖更詳細(xì)地描述本公開(kāi)的示例性實(shí)施例。雖然附圖中顯示了本公開(kāi)的示例性實(shí)施例,然而應(yīng)當(dāng)理解,可以以各種形式實(shí)現(xiàn)本公開(kāi)而不應(yīng)被這里闡述的實(shí)施例所限制。相反,提供這些實(shí)施例是為了能夠更透徹地理解本公開(kāi),并且能夠?qū)⒈竟_(kāi)的范圍完整的傳達(dá)給本領(lǐng)域的技術(shù)人員。
本發(fā)明實(shí)施例提供了一種消息隊(duì)列的消費(fèi)方法及裝置,至少能夠解決現(xiàn)有技術(shù)中默認(rèn)根據(jù)之前記錄的當(dāng)前數(shù)據(jù)偏移進(jìn)行消費(fèi)所導(dǎo)致的消費(fèi)失敗的技術(shù)問(wèn)題。
實(shí)施例一
圖1示出了本發(fā)明實(shí)施例一提供的一種消息隊(duì)列的消費(fèi)方法的流程示意圖,該方法包括:
步驟S110:當(dāng)消費(fèi)任務(wù)啟動(dòng)時(shí),獲取所述消費(fèi)任務(wù)對(duì)應(yīng)的消息隊(duì)列的最舊數(shù)據(jù)偏移。
其中,消費(fèi)任務(wù)是指:消費(fèi)端讀取并處理消息隊(duì)列的任務(wù)。其中,一個(gè)消息隊(duì)列可能對(duì)應(yīng)一個(gè)或多個(gè)消費(fèi)任務(wù),一個(gè)消費(fèi)任務(wù)也可能對(duì)應(yīng)一個(gè)或多個(gè)消息隊(duì)列。當(dāng)一個(gè)消費(fèi)任務(wù)啟動(dòng)時(shí),獲取該消費(fèi)任務(wù)對(duì)應(yīng)的消息隊(duì)列的最舊數(shù)據(jù)偏移。其中,消費(fèi)任務(wù)的啟動(dòng)包括消費(fèi)任務(wù)第一次開(kāi)啟以及消費(fèi)任務(wù)中斷后的重啟等各種情形。
步驟S120:將該消息隊(duì)列的最舊數(shù)據(jù)偏移與預(yù)先存儲(chǔ)的該消息隊(duì)列的當(dāng)前數(shù)據(jù)偏移進(jìn)行比較。
具體地,獲取到該消息隊(duì)列的最舊數(shù)據(jù)偏移之后,進(jìn)一步獲取預(yù)先存儲(chǔ)的該消息隊(duì)列的當(dāng)前數(shù)據(jù)偏移,以便將最舊數(shù)據(jù)偏移與預(yù)先存儲(chǔ)的該消息隊(duì)列的當(dāng)前數(shù)據(jù)偏移進(jìn)行比較。其中,該消息隊(duì)列的當(dāng)前數(shù)據(jù)偏移可以通過(guò)多種方式進(jìn)行存儲(chǔ),例如,可以由執(zhí)行該消費(fèi)任務(wù)的消費(fèi)端存儲(chǔ)在本地,也可以由專(zhuān)門(mén)的后臺(tái)數(shù)據(jù)庫(kù)負(fù)責(zé)存儲(chǔ),本發(fā)明對(duì)該消息隊(duì)列的當(dāng)前數(shù)據(jù)偏移的存儲(chǔ)方式不做限定。
步驟S130:當(dāng)最舊數(shù)據(jù)偏移小于當(dāng)前數(shù)據(jù)偏移時(shí),根據(jù)當(dāng)前數(shù)據(jù)偏移讀取該消息隊(duì)列中的消息數(shù)據(jù)。
具體地,若最舊數(shù)據(jù)偏移小于當(dāng)前數(shù)據(jù)偏移,則說(shuō)明當(dāng)前數(shù)據(jù)偏移所對(duì)應(yīng)位置處的消息尚未刪除,因此,當(dāng)前數(shù)據(jù)偏移為有效偏移,相應(yīng)地,可以根據(jù)當(dāng)前數(shù)據(jù)偏移進(jìn)行讀取。例如,若最舊數(shù)據(jù)偏移為30,當(dāng)前數(shù)據(jù)偏移為50,則從50開(kāi)始讀取消息隊(duì)列中的消息數(shù)據(jù)。
步驟S140:每當(dāng)從消息隊(duì)列中讀取一條消息數(shù)據(jù)后,根據(jù)該條消息數(shù)據(jù)對(duì)應(yīng)的偏移地址更新預(yù)先存儲(chǔ)的該消息隊(duì)列的當(dāng)前數(shù)據(jù)偏移。
通過(guò)本步驟能夠動(dòng)態(tài)更新記錄的當(dāng)前數(shù)據(jù)偏移,以確保每次消費(fèi)任務(wù)啟動(dòng)時(shí)獲取到的當(dāng)前數(shù)據(jù)偏移的準(zhǔn)確性。
由此可見(jiàn),本申請(qǐng)中的方式能夠判斷出當(dāng)前數(shù)據(jù)偏移所對(duì)應(yīng)位置的消息是否已被刪除,從而避免了消費(fèi)失敗的現(xiàn)象,提升了整個(gè)數(shù)據(jù)處理系統(tǒng)的可靠性。
實(shí)施例二
圖2示出了本發(fā)明實(shí)施例二提供的一種消息隊(duì)列的消費(fèi)方法的流程示意圖,如圖2所示,該方法包括:
步驟S210:當(dāng)消費(fèi)任務(wù)啟動(dòng)時(shí),獲取該消費(fèi)任務(wù)對(duì)應(yīng)的消息隊(duì)列的最舊數(shù)據(jù)偏移。
其中,消費(fèi)任務(wù)是指:消費(fèi)端讀取并處理消息隊(duì)列的任務(wù)。其中,一個(gè)消息隊(duì)列可能對(duì)應(yīng)一個(gè)或多個(gè)消費(fèi)任務(wù),一個(gè)消費(fèi)任務(wù)也可能對(duì)應(yīng)一個(gè)或多個(gè)消息隊(duì)列。消費(fèi)任務(wù)的啟動(dòng)包括消費(fèi)任務(wù)第一次開(kāi)啟以及消費(fèi)任務(wù)中斷后的重啟等各種情形。另外,在本實(shí)施例中,為了便于說(shuō)明,僅以一個(gè)消費(fèi)任務(wù)為例進(jìn)行描述,在實(shí)際場(chǎng)景中,通常有多個(gè)消費(fèi)任務(wù)并行執(zhí)行,相應(yīng)地,需要分別針對(duì)每個(gè)消費(fèi)任務(wù)并行執(zhí)行步驟S210及其后續(xù)的各個(gè)步驟,以實(shí)現(xiàn)多任務(wù)的并行處理。
當(dāng)一個(gè)消費(fèi)任務(wù)啟動(dòng)時(shí),執(zhí)行該消費(fèi)任務(wù)的消費(fèi)端負(fù)責(zé)獲取該消費(fèi)任務(wù)對(duì)應(yīng)的消息隊(duì)列的最舊數(shù)據(jù)偏移。具體地,本領(lǐng)域技術(shù)人員可以靈活通過(guò)各種獲取最舊數(shù)據(jù)偏移,本發(fā)明對(duì)此不作限定。在本實(shí)施例中,為了確保獲取到的最舊數(shù)據(jù)偏移的準(zhǔn)確性,需由執(zhí)行該消費(fèi)任務(wù)的消費(fèi)端與用于維護(hù)消息隊(duì)列的隊(duì)列服務(wù)器之間建立通信連接,通過(guò)該通信連接獲取消息隊(duì)列的最舊數(shù)據(jù)偏移。
具體地,發(fā)明人在實(shí)現(xiàn)本發(fā)明的過(guò)程中發(fā)現(xiàn):在現(xiàn)有技術(shù)中,執(zhí)行該消費(fèi)任務(wù)的消費(fèi)端僅在消費(fèi)消息時(shí),才會(huì)與用于維護(hù)消息隊(duì)列的隊(duì)列服務(wù)器建立一條用于讀取消息的數(shù)據(jù)鏈路,由于該數(shù)據(jù)鏈路是在消息讀取過(guò)程中建立的,因此,在消費(fèi)任務(wù)剛剛啟動(dòng)時(shí),該數(shù)據(jù)鏈路尚未建立,因而顯然無(wú)法通過(guò)該數(shù)據(jù)鏈路獲取隊(duì)列服務(wù)器上存儲(chǔ)的消息隊(duì)列的最舊數(shù)據(jù)偏移,因此,在現(xiàn)有技術(shù)中,執(zhí)行該消費(fèi)任務(wù)的消費(fèi)端顯然無(wú)法根據(jù)隊(duì)列服務(wù)器獲取最舊數(shù)據(jù)偏移,由此導(dǎo)致現(xiàn)有技術(shù)中的消息消費(fèi)方式無(wú)法獲取到準(zhǔn)確的最舊數(shù)據(jù)偏移,進(jìn)而無(wú)法有效避免消息消費(fèi)失敗現(xiàn)象。在本發(fā)明中,發(fā)明人提出了如下改進(jìn)方案:在執(zhí)行該消費(fèi)任務(wù)的消費(fèi)端消費(fèi)消息之前,與用于維護(hù)消息隊(duì)列的隊(duì)列服務(wù)器之間建立一條專(zhuān)用的通信連接,通過(guò)該專(zhuān)用的通信連接獲取消息隊(duì)列的最舊數(shù)據(jù)偏移,從而能夠根據(jù)隊(duì)列服務(wù)器獲取到準(zhǔn)確的最舊數(shù)據(jù)偏移。
步驟S220:將消息隊(duì)列的最舊數(shù)據(jù)偏移與預(yù)先存儲(chǔ)的該消息隊(duì)列的當(dāng)前數(shù)據(jù)偏移進(jìn)行比較,當(dāng)最舊數(shù)據(jù)偏移小于當(dāng)前數(shù)據(jù)偏移時(shí),則執(zhí)行步驟S230;當(dāng)最舊數(shù)據(jù)偏移不小于當(dāng)前數(shù)據(jù)偏移時(shí),則執(zhí)行步驟S240。
具體地,獲取到該消息隊(duì)列的最舊數(shù)據(jù)偏移之后,進(jìn)一步獲取預(yù)先存儲(chǔ)的該消息隊(duì)列的當(dāng)前數(shù)據(jù)偏移,以便將最舊數(shù)據(jù)偏移與預(yù)先存儲(chǔ)的該消息隊(duì)列的當(dāng)前數(shù)據(jù)偏移進(jìn)行比較。其中,該消息隊(duì)列的當(dāng)前數(shù)據(jù)偏移可以通過(guò)多種方式進(jìn)行存儲(chǔ),例如,可以由執(zhí)行該消費(fèi)任務(wù)的消費(fèi)端存儲(chǔ)在本地,也可以由專(zhuān)門(mén)的后臺(tái)數(shù)據(jù)庫(kù)負(fù)責(zé)存儲(chǔ),本發(fā)明對(duì)該消息隊(duì)列的當(dāng)前數(shù)據(jù)偏移的存儲(chǔ)方式不做限定。
在本實(shí)施例中,為了提升當(dāng)前數(shù)據(jù)偏移的準(zhǔn)確性,解決由于消費(fèi)端出現(xiàn)故障重啟后所導(dǎo)致的本地存儲(chǔ)的當(dāng)前數(shù)據(jù)偏移丟失等問(wèn)題,將當(dāng)前數(shù)據(jù)偏移存儲(chǔ)在后臺(tái)數(shù)據(jù)庫(kù)中,由后臺(tái)數(shù)據(jù)庫(kù)記錄各個(gè)消費(fèi)任務(wù)對(duì)應(yīng)的消息隊(duì)列的當(dāng)前數(shù)據(jù)偏移。具體實(shí)現(xiàn)時(shí),可以在后臺(tái)數(shù)據(jù)庫(kù)上設(shè)置偏移信息列表,該偏移信息列表中記錄了各個(gè)消費(fèi)任務(wù)的任務(wù)標(biāo)識(shí)與各個(gè)消費(fèi)任務(wù)對(duì)應(yīng)的當(dāng)前數(shù)據(jù)偏移之間的映射關(guān)系。該偏移信息列表隨著消費(fèi)任務(wù)的消費(fèi)進(jìn)度而動(dòng)態(tài)更新。具體地,消費(fèi)任務(wù)對(duì)應(yīng)的消費(fèi)端可以在任務(wù)啟動(dòng)時(shí)建立與后臺(tái)數(shù)據(jù)庫(kù)之間的通信連接,并通過(guò)該通信連接向后臺(tái)數(shù)據(jù)庫(kù)發(fā)送攜帶該消費(fèi)任務(wù)的任務(wù)標(biāo)識(shí)的請(qǐng)求信息,后臺(tái)數(shù)據(jù)庫(kù)根據(jù)接收到的請(qǐng)求信息中包含的任務(wù)標(biāo)識(shí),查詢上述的偏移信息列表,若從該偏移信息列表中查詢到了該任務(wù)標(biāo)識(shí)對(duì)應(yīng)的消費(fèi)任務(wù)的當(dāng)前數(shù)據(jù)偏移,則向該消費(fèi)任務(wù)對(duì)應(yīng)的消費(fèi)端返回?cái)y帶當(dāng)前數(shù)據(jù)偏移的響應(yīng)消息,當(dāng)消費(fèi)端接收到該響應(yīng)消息時(shí),確定獲取當(dāng)前數(shù)據(jù)偏移的操作結(jié)果為成功;若從該偏移信息列表中未查詢到該任務(wù)標(biāo)識(shí)對(duì)應(yīng)的消費(fèi)任務(wù)的當(dāng)前數(shù)據(jù)偏移,則向該消費(fèi)任務(wù)對(duì)應(yīng)的消費(fèi)端返回失敗消息,當(dāng)消費(fèi)端接收到該失敗消息時(shí),確定獲取當(dāng)前數(shù)據(jù)偏移的操作結(jié)果為失敗。通常情況下,偏移信息列表會(huì)記錄所有消費(fèi)任務(wù)對(duì)應(yīng)的消息隊(duì)列的當(dāng)前數(shù)據(jù)偏移,但是,當(dāng)一個(gè)消費(fèi)任務(wù)首次啟動(dòng)時(shí),該偏移信息列表可能尚未記錄該消費(fèi)任務(wù)對(duì)應(yīng)的消息隊(duì)列的當(dāng)前數(shù)據(jù)偏移,因此,可能會(huì)出現(xiàn)未查詢到當(dāng)前數(shù)據(jù)偏移的情況,從而導(dǎo)致獲取當(dāng)前數(shù)據(jù)偏移的操作結(jié)果失敗。
步驟S230:根據(jù)當(dāng)前數(shù)據(jù)偏移讀取該消息隊(duì)列中的消息數(shù)據(jù)。
具體地,若最舊數(shù)據(jù)偏移小于當(dāng)前數(shù)據(jù)偏移,則說(shuō)明當(dāng)前數(shù)據(jù)偏移所對(duì)應(yīng)位置處的消息尚未刪除,因此,當(dāng)前數(shù)據(jù)偏移為有效偏移,相應(yīng)地,可以根據(jù)當(dāng)前數(shù)據(jù)偏移進(jìn)行讀取。例如,若最舊數(shù)據(jù)偏移為30,當(dāng)前數(shù)據(jù)偏移為50,則從50開(kāi)始讀取消息隊(duì)列中的消息數(shù)據(jù)。
通過(guò)當(dāng)前數(shù)據(jù)偏移進(jìn)行讀取,能夠有效防止重復(fù)消費(fèi)的現(xiàn)象,由于在某些工程中,要求消息隊(duì)列中的消息數(shù)據(jù)只能消費(fèi)一次,一旦消息隊(duì)列中的部分消息數(shù)據(jù)出現(xiàn)了重復(fù)消費(fèi)的現(xiàn)象,則會(huì)對(duì)整個(gè)工程造成不可估量的損失,因此,通過(guò)當(dāng)前數(shù)據(jù)偏移進(jìn)行讀取的方式尤其適用于嚴(yán)格限定消息的消費(fèi)次數(shù)的應(yīng)用場(chǎng)景中。
步驟S240:根據(jù)最舊數(shù)據(jù)偏移讀取該消息隊(duì)列中的消息數(shù)據(jù)。
其中,若最舊數(shù)據(jù)偏移不小于當(dāng)前數(shù)據(jù)偏移,則說(shuō)明當(dāng)前數(shù)據(jù)偏移所對(duì)應(yīng)位置處的消息已被刪除,因此,當(dāng)前數(shù)據(jù)偏移為無(wú)效偏移,相應(yīng)地,可以根據(jù)最舊數(shù)據(jù)偏移進(jìn)行讀取。例如,若最舊數(shù)據(jù)偏移為80,當(dāng)前數(shù)據(jù)偏移為50,則從80開(kāi)始讀取消息隊(duì)列中的消息數(shù)據(jù)。
具體地,消息隊(duì)列中存儲(chǔ)的消息數(shù)據(jù)由負(fù)責(zé)維護(hù)該消息隊(duì)列的隊(duì)列服務(wù)器定期更新,更新操作具體包括:向消息隊(duì)列中持續(xù)寫(xiě)入新的消息數(shù)據(jù),以及定期刪除消息隊(duì)列中舊的消息數(shù)據(jù)。例如,假設(shè)消息隊(duì)列中原本存儲(chǔ)了100條數(shù)據(jù),其對(duì)應(yīng)的偏移地址為1-100,此時(shí),消息隊(duì)列的最舊數(shù)據(jù)偏移為1(即:消息隊(duì)列中存儲(chǔ)的數(shù)據(jù)中時(shí)間最早的數(shù)據(jù)的偏移為1),消息隊(duì)列的最大數(shù)據(jù)偏移為100(即:消息隊(duì)列中存儲(chǔ)的數(shù)據(jù)中時(shí)間最晚的數(shù)據(jù)的偏移為100)。經(jīng)過(guò)一段時(shí)間后,消息隊(duì)列中又新增了200條數(shù)據(jù),該新增的200數(shù)據(jù)對(duì)應(yīng)的偏移地址為101-300,與此同時(shí),為了防止消息隊(duì)列的存儲(chǔ)空間不足,隊(duì)列服務(wù)器刪除了其中偏移為1-50的50條數(shù)據(jù),相應(yīng)地,消息隊(duì)列的最舊數(shù)據(jù)偏移為51,消息隊(duì)列的最大數(shù)據(jù)偏移為300。由此可見(jiàn),消息隊(duì)列的最舊數(shù)據(jù)偏移是動(dòng)態(tài)變化的,小于最舊數(shù)據(jù)偏移的偏移地址所對(duì)應(yīng)的消息已被刪除,因此,小于最舊數(shù)據(jù)偏移的偏移地址為無(wú)效地址,因此,在本實(shí)施例中,為了防止由于消費(fèi)端從無(wú)效地址處開(kāi)始消費(fèi)所導(dǎo)致的消費(fèi)失敗現(xiàn)象,需要將當(dāng)前數(shù)據(jù)偏移與最舊數(shù)據(jù)偏移進(jìn)行比較判斷。其中,消息隊(duì)列的有效數(shù)據(jù)范圍是由上述的最舊數(shù)據(jù)偏移和最大數(shù)據(jù)偏移所界定的數(shù)據(jù)范圍,例如,在上例中,消息隊(duì)列的有效數(shù)據(jù)范圍從最初的[1,100]變更為[51,300]。相應(yīng)地,當(dāng)獲取到的當(dāng)前數(shù)據(jù)偏移屬于有效范圍內(nèi)時(shí),例如,當(dāng)消息隊(duì)列的有效數(shù)據(jù)范圍為[1,100]時(shí),若讀取到的當(dāng)前數(shù)據(jù)偏移為49,則說(shuō)明當(dāng)前數(shù)據(jù)偏移屬于有效范圍內(nèi),因而根據(jù)當(dāng)前數(shù)據(jù)偏移進(jìn)行讀取。當(dāng)獲取到的當(dāng)前數(shù)據(jù)偏移不屬于有效范圍內(nèi)時(shí),例如,當(dāng)消息隊(duì)列的有效數(shù)據(jù)范圍為[51,300]時(shí),若讀取到的當(dāng)前數(shù)據(jù)偏移為49,則說(shuō)明當(dāng)前數(shù)據(jù)偏移不屬于有效范圍內(nèi),因而根據(jù)有效數(shù)據(jù)范圍中的最舊數(shù)據(jù)對(duì)應(yīng)的位置(即偏移地址為51的位置)進(jìn)行讀取。具體地,由于維護(hù)各個(gè)消息對(duì)列的隊(duì)列服務(wù)器上準(zhǔn)確而及時(shí)地記錄了各個(gè)消息隊(duì)列的有效數(shù)據(jù)范圍,因此,在本實(shí)施例中,由消費(fèi)端與隊(duì)列服務(wù)器建立通信連接并獲取最舊數(shù)據(jù)偏移的方式能夠有效提升最舊數(shù)據(jù)偏移的準(zhǔn)確性。
步驟S250:每當(dāng)從消息隊(duì)列中讀取一條消息數(shù)據(jù)后,根據(jù)該條消息數(shù)據(jù)對(duì)應(yīng)的偏移地址更新預(yù)先存儲(chǔ)的該消息隊(duì)列的當(dāng)前數(shù)據(jù)偏移。
通過(guò)本步驟能夠動(dòng)態(tài)更新當(dāng)前數(shù)據(jù)偏移,以確保每次消費(fèi)任務(wù)啟動(dòng)時(shí)獲取到的當(dāng)前數(shù)據(jù)偏移的準(zhǔn)確性。具體更新頻率可由本領(lǐng)域技術(shù)人員靈活設(shè)定,例如,除了采用每讀取一條消息數(shù)據(jù)即進(jìn)行一次更新操作的方式之外,在本發(fā)明其他的實(shí)施例中,還可以采用每隔預(yù)設(shè)時(shí)間間隔更新一次當(dāng)前數(shù)據(jù)偏移的方式,具體的時(shí)間間隔可根據(jù)業(yè)務(wù)類(lèi)型靈活設(shè)定。例如,對(duì)于業(yè)務(wù)可靠性要求較高的情況,將時(shí)間間隔設(shè)置得較短,以保證當(dāng)前數(shù)據(jù)偏移的及時(shí)更新;對(duì)于業(yè)務(wù)可靠性要求較低的情況,將時(shí)間間隔設(shè)置得較長(zhǎng),以降低設(shè)備負(fù)載及網(wǎng)絡(luò)傳輸開(kāi)銷(xiāo)。
另外,以當(dāng)前數(shù)據(jù)偏移存儲(chǔ)在后臺(tái)數(shù)據(jù)庫(kù)中為例,發(fā)明人在實(shí)現(xiàn)本發(fā)明的過(guò)程中發(fā)現(xiàn),在根據(jù)該條消息數(shù)據(jù)對(duì)應(yīng)的偏移地址更新后臺(tái)數(shù)據(jù)庫(kù)中存儲(chǔ)的該消息隊(duì)列的當(dāng)前數(shù)據(jù)偏移時(shí),若僅向后臺(tái)數(shù)據(jù)庫(kù)中寫(xiě)入當(dāng)前已讀取消息所對(duì)應(yīng)的偏移信息,而不寫(xiě)入該偏移信息所對(duì)應(yīng)的具體消息內(nèi)容,則一旦因傳輸異常等原因?qū)е聦?xiě)入的偏移信息出現(xiàn)失效或錯(cuò)誤時(shí),無(wú)法及時(shí)發(fā)現(xiàn)并糾正,進(jìn)而會(huì)導(dǎo)致重復(fù)消費(fèi)甚至消費(fèi)失敗等現(xiàn)象。因此,在后臺(tái)數(shù)據(jù)庫(kù)中更新消息隊(duì)列的當(dāng)前數(shù)據(jù)偏移時(shí),需要同時(shí)寫(xiě)入已讀取的最新消息數(shù)據(jù)所對(duì)應(yīng)的偏移地址以及該條消息數(shù)據(jù)的數(shù)據(jù)內(nèi)容,以防止出錯(cuò)。但是,由于寫(xiě)入已讀取的最新消息數(shù)據(jù)所對(duì)應(yīng)的偏移地址以及寫(xiě)入該條消息數(shù)據(jù)的數(shù)據(jù)內(nèi)容時(shí)涉及到兩次操作,即使將這兩次操作通過(guò)并行執(zhí)行的線程同步完成,也依然可能出現(xiàn)其中的一次操作執(zhí)行成功而另一次操作執(zhí)行失敗的異常情況。例如,假設(shè)寫(xiě)入已讀取的最新消息數(shù)據(jù)所對(duì)應(yīng)的偏移地址的操作的執(zhí)行結(jié)果為成功,但是寫(xiě)入該條消息數(shù)據(jù)的數(shù)據(jù)內(nèi)容的操作的執(zhí)行結(jié)果為失敗,而此時(shí)恰逢消費(fèi)端因故重啟,則重啟后的消費(fèi)端從后臺(tái)數(shù)據(jù)庫(kù)中獲取到的當(dāng)前數(shù)據(jù)偏移所對(duì)應(yīng)的消息內(nèi)容實(shí)際上還未消費(fèi)成功,因此,若消費(fèi)端根據(jù)獲取到的當(dāng)前數(shù)據(jù)偏移進(jìn)行消費(fèi)則會(huì)遺漏該偏移信息所對(duì)應(yīng)的消息內(nèi)容。又如,假設(shè)寫(xiě)入該條消息數(shù)據(jù)的數(shù)據(jù)內(nèi)容的操作的執(zhí)行結(jié)果為成功,但是寫(xiě)入已讀取的最新消息數(shù)據(jù)所對(duì)應(yīng)的偏移地址的操作的執(zhí)行結(jié)果為失敗,而此時(shí)恰逢消費(fèi)端因故重啟,則重啟后的消費(fèi)端從后臺(tái)數(shù)據(jù)庫(kù)中獲取到的當(dāng)前數(shù)據(jù)偏移實(shí)際上為已讀取的最新消息數(shù)據(jù)的上一個(gè)數(shù)據(jù)所對(duì)應(yīng)的偏移信息,因此,若消費(fèi)端根據(jù)獲取到的當(dāng)前數(shù)據(jù)偏移進(jìn)行消費(fèi)則會(huì)導(dǎo)致重復(fù)消費(fèi)現(xiàn)象。
為了解決上述問(wèn)題,發(fā)明人通過(guò)下述方式實(shí)現(xiàn)在后臺(tái)數(shù)據(jù)庫(kù)中更新消息隊(duì)列的當(dāng)前數(shù)據(jù)偏移的操作過(guò)程:首先,創(chuàng)建用于更新當(dāng)前數(shù)據(jù)偏移的事務(wù),該事務(wù)包括:用于寫(xiě)入該條消息數(shù)據(jù)對(duì)應(yīng)的偏移地址的第一操作,以及用于寫(xiě)入該條消息數(shù)據(jù)的數(shù)據(jù)內(nèi)容的第二操作;然后,檢測(cè)該事務(wù)中包含的第一操作和第二操作的執(zhí)行結(jié)果,當(dāng)該事務(wù)中包含的第一操作和第二操作都執(zhí)行成功時(shí),向后臺(tái)數(shù)據(jù)庫(kù)提交該事務(wù);當(dāng)該事務(wù)中包含的第一操作和/或第二操作執(zhí)行失敗時(shí),回滾該事務(wù),可選地,在回滾事務(wù)的同時(shí),還可以重啟相應(yīng)的消費(fèi)任務(wù)。由此可見(jiàn),每當(dāng)在后臺(tái)數(shù)據(jù)庫(kù)中更新消息隊(duì)列的當(dāng)前數(shù)據(jù)偏移時(shí),需要為本次更新操作創(chuàng)建一個(gè)事務(wù),該事務(wù)是一個(gè)并發(fā)控制的單位,也叫自定義的一個(gè)操作序列,操作序列中包含的各個(gè)操作屬于一個(gè)不可分割的工作單位,只有當(dāng)該操作序列中的所有操作全部執(zhí)行成功時(shí),該事務(wù)才算執(zhí)行完畢;只要該操作序列中有一個(gè)操作未執(zhí)行成功,就會(huì)導(dǎo)致該事務(wù)執(zhí)行失敗。相應(yīng)地,本實(shí)施例中的后臺(tái)數(shù)據(jù)庫(kù)為支持事務(wù)的數(shù)據(jù)庫(kù)。通過(guò)將用于寫(xiě)入該條消息數(shù)據(jù)對(duì)應(yīng)的偏移地址的第一操作以及用于寫(xiě)入該條消息數(shù)據(jù)的數(shù)據(jù)內(nèi)容的第二操作全部添加到用于更新的事務(wù)當(dāng)中,能夠確保只有在兩種操作都執(zhí)行成功時(shí),才向后臺(tái)數(shù)據(jù)庫(kù)提交本次事務(wù),只要兩種操作中有一個(gè)操作未執(zhí)行成功,則回滾該事務(wù),并重啟相應(yīng)的消費(fèi)任務(wù),以確保更新操作的準(zhǔn)確性,進(jìn)而確保消費(fèi)的準(zhǔn)確性,有效避免重復(fù)消費(fèi)的現(xiàn)象。由于消費(fèi)任務(wù)每次重啟后都會(huì)從沒(méi)有被成功消費(fèi)的地方開(kāi)始消費(fèi),進(jìn)而還確保了每個(gè)數(shù)據(jù)塊被嚴(yán)格消費(fèi)一次。
另外,與將當(dāng)前數(shù)據(jù)偏移存儲(chǔ)在消費(fèi)端本地的方式相比,將當(dāng)前數(shù)據(jù)偏移存儲(chǔ)在后臺(tái)數(shù)據(jù)庫(kù)中還可以有效防止因消費(fèi)端故障所導(dǎo)致的當(dāng)前數(shù)據(jù)偏移丟失的問(wèn)題。
通過(guò)上述的各個(gè)步驟即可確保消息隊(duì)列的準(zhǔn)確消費(fèi)、并防止重復(fù)消費(fèi)以及消費(fèi)失敗的現(xiàn)象。
另外,本領(lǐng)域技術(shù)人員還可以對(duì)上述實(shí)施例進(jìn)行各種改動(dòng)和變形。例如,可以將上述實(shí)施例中的各個(gè)步驟拆分成更多的步驟,或合并為更少的步驟,還可以調(diào)整各個(gè)步驟之間的執(zhí)行順序,甚至可以刪減部分步驟或新增一些步驟,總之,本發(fā)明對(duì)具體的實(shí)現(xiàn)細(xì)節(jié)不做限定。
而且,在上述實(shí)施例中,是以消息隊(duì)列為單位進(jìn)行描述的,在實(shí)際情況中,一個(gè)消息隊(duì)列往往具有多個(gè)消息分區(qū),相應(yīng)地,消費(fèi)任務(wù)通過(guò)消費(fèi)各個(gè)消息分區(qū)的方式實(shí)現(xiàn)對(duì)整個(gè)消息隊(duì)列的消費(fèi),而且,一個(gè)消息隊(duì)列還可能對(duì)應(yīng)于多個(gè)消費(fèi)任務(wù),每個(gè)消費(fèi)任務(wù)負(fù)責(zé)消費(fèi)預(yù)定的一個(gè)或多個(gè)消息分區(qū)。此時(shí),上述實(shí)施例中提到的消費(fèi)任務(wù)對(duì)應(yīng)的消息隊(duì)列的當(dāng)前數(shù)據(jù)偏移可以進(jìn)一步細(xì)化為消費(fèi)任務(wù)對(duì)應(yīng)的消息分區(qū)的當(dāng)前數(shù)據(jù)偏移。與之相應(yīng)地,預(yù)先存儲(chǔ)的該消息隊(duì)列的當(dāng)前數(shù)據(jù)偏移包括:該消息隊(duì)列的各個(gè)消息分區(qū)的當(dāng)前數(shù)據(jù)偏移;上述獲取消息隊(duì)列的最舊數(shù)據(jù)偏移的步驟具體為:分別獲取消息隊(duì)列的各個(gè)消息分區(qū)的最舊數(shù)據(jù)偏移;上述將消息隊(duì)列的最舊數(shù)據(jù)偏移與預(yù)先存儲(chǔ)的該消息隊(duì)列的當(dāng)前數(shù)據(jù)偏移進(jìn)行比較的步驟具體為:分別將消息隊(duì)列的各個(gè)消息分區(qū)的最舊數(shù)據(jù)偏移與預(yù)先存儲(chǔ)的該消息隊(duì)列相應(yīng)的消息分區(qū)的當(dāng)前數(shù)據(jù)偏移進(jìn)行比較;上述根據(jù)該條消息數(shù)據(jù)對(duì)應(yīng)的偏移地址更新存儲(chǔ)的該消息隊(duì)列的當(dāng)前數(shù)據(jù)偏移的步驟具體為:根據(jù)該條消息數(shù)據(jù)對(duì)應(yīng)的偏移地址更新該消息隊(duì)列相應(yīng)的消息分區(qū)的當(dāng)前數(shù)據(jù)偏移。另外,上述實(shí)施例中的消息隊(duì)列可以采用分布式消息隊(duì)列實(shí)現(xiàn),從而更好地支持各類(lèi)并行業(yè)務(wù)。
綜上所述,通過(guò)本實(shí)施例中的消息隊(duì)列的消費(fèi)方法,一方面,能夠由后臺(tái)數(shù)據(jù)庫(kù)記錄各個(gè)消費(fèi)任務(wù)對(duì)應(yīng)的消息隊(duì)列的當(dāng)前數(shù)據(jù)偏移,從而根據(jù)后臺(tái)數(shù)據(jù)庫(kù)記錄的當(dāng)前數(shù)據(jù)偏移進(jìn)行消費(fèi),實(shí)現(xiàn)防止重復(fù)消費(fèi)的目的;另一方面,還能夠從隊(duì)列服務(wù)器中獲取消息隊(duì)列的有效數(shù)據(jù)范圍,進(jìn)而判斷從后臺(tái)數(shù)據(jù)庫(kù)獲取到的當(dāng)前數(shù)據(jù)偏移是否屬于有效數(shù)據(jù)范圍之內(nèi),并在判斷結(jié)果為否時(shí)根據(jù)有效數(shù)據(jù)范圍進(jìn)行消費(fèi),實(shí)現(xiàn)防止消費(fèi)失敗的目的。并且,在上述過(guò)程中,進(jìn)一步利用事務(wù)來(lái)實(shí)現(xiàn)更新操作,從而有效提升了更新操作的準(zhǔn)確性。
實(shí)施例三
圖3示出了本發(fā)明實(shí)施例三提供的一種消息隊(duì)列的消費(fèi)裝置的結(jié)構(gòu)示意圖,如圖3所述,該消息對(duì)列的消費(fèi)裝置包括:
獲取模塊31,適于當(dāng)消費(fèi)任務(wù)啟動(dòng)時(shí),獲取所述消費(fèi)任務(wù)對(duì)應(yīng)的消息隊(duì)列的最舊數(shù)據(jù)偏移;
比較模塊32,適于將所述消息隊(duì)列的最舊數(shù)據(jù)偏移與預(yù)先存儲(chǔ)的該消息隊(duì)列的當(dāng)前數(shù)據(jù)偏移進(jìn)行比較;
讀取模塊33,適于當(dāng)所述最舊數(shù)據(jù)偏移小于所述當(dāng)前數(shù)據(jù)偏移時(shí),根據(jù)所述當(dāng)前數(shù)據(jù)偏移讀取該消息隊(duì)列中的消息數(shù)據(jù);
更新模塊34,適于每當(dāng)從所述消息隊(duì)列中讀取一條消息數(shù)據(jù)后,根據(jù)該條消息數(shù)據(jù)對(duì)應(yīng)的偏移地址更新所述預(yù)先存儲(chǔ)的該消息隊(duì)列的當(dāng)前數(shù)據(jù)偏移。
其中,所述讀取模塊33進(jìn)一步適于:當(dāng)所述最舊數(shù)據(jù)偏移不小于所述當(dāng)前數(shù)據(jù)偏移時(shí),根據(jù)所述最舊數(shù)據(jù)偏移讀取該消息隊(duì)列中的消息數(shù)據(jù)。
其中,所述消息隊(duì)列具有多個(gè)消息分區(qū),且所述預(yù)先存儲(chǔ)的該消息隊(duì)列的當(dāng)前數(shù)據(jù)偏移包括:該消息隊(duì)列的各個(gè)消息分區(qū)的當(dāng)前數(shù)據(jù)偏移;所述獲取模塊31具體適于:分別獲取所述消息隊(duì)列的各個(gè)消息分區(qū)的最舊數(shù)據(jù)偏移;所述比較模塊32具體適于:分別將所述消息隊(duì)列的各個(gè)消息分區(qū)的最舊數(shù)據(jù)偏移與預(yù)先存儲(chǔ)的該消息隊(duì)列相應(yīng)的消息分區(qū)的當(dāng)前數(shù)據(jù)偏移進(jìn)行比較;所述更新模塊34具體適于:根據(jù)該條消息數(shù)據(jù)對(duì)應(yīng)的偏移地址更新該消息隊(duì)列相應(yīng)的消息分區(qū)的當(dāng)前數(shù)據(jù)偏移。
其中,所述更新模塊34具體適于:創(chuàng)建用于更新當(dāng)前數(shù)據(jù)偏移的事務(wù),該事務(wù)包括:用于寫(xiě)入該條消息數(shù)據(jù)對(duì)應(yīng)的偏移地址的第一操作,以及用于寫(xiě)入該條消息數(shù)據(jù)的數(shù)據(jù)內(nèi)容的第二操作;當(dāng)該事務(wù)中包含的第一操作和第二操作都執(zhí)行成功時(shí),向后臺(tái)數(shù)據(jù)庫(kù)提交該事務(wù);當(dāng)該事務(wù)中包含的第一操作和/或第二操作執(zhí)行失敗時(shí),回滾該事務(wù)。
可選地,所述獲取模塊31具體適于:與用于維護(hù)所述消息隊(duì)列的隊(duì)列服務(wù)器之間建立通信連接,通過(guò)所述通信連接獲取所述消息隊(duì)列的最舊數(shù)據(jù)偏移。其中,所述消息隊(duì)列為分布式消息隊(duì)列。
上述各個(gè)模塊的具體結(jié)構(gòu)和工作原理可參照方法實(shí)施例中相應(yīng)步驟的描述,此處不再贅述。
在本發(fā)明提供的一種消息隊(duì)列的消費(fèi)方法及裝置中,每當(dāng)消費(fèi)任務(wù)啟動(dòng)時(shí),能夠獲取到該消費(fèi)任務(wù)對(duì)應(yīng)的消息隊(duì)列的最舊數(shù)據(jù)偏移,并將該消息隊(duì)列的最舊數(shù)據(jù)偏移與預(yù)先存儲(chǔ)的該消息隊(duì)列的當(dāng)前數(shù)據(jù)偏移進(jìn)行比較,只有在最舊數(shù)據(jù)偏移小于當(dāng)前數(shù)據(jù)偏移時(shí),才根據(jù)當(dāng)前數(shù)據(jù)偏移讀取該消息隊(duì)列中的消息數(shù)據(jù)。由此可見(jiàn),本申請(qǐng)中的方式能夠判斷出當(dāng)前數(shù)據(jù)偏移所對(duì)應(yīng)位置的消息是否已被刪除,從而避免了消費(fèi)失敗的現(xiàn)象,提升了整個(gè)數(shù)據(jù)處理系統(tǒng)的可靠性。
在此提供的算法和顯示不與任何特定計(jì)算機(jī)、虛擬系統(tǒng)或者其它設(shè)備固有相關(guān)。各種通用系統(tǒng)也可以與基于在此的示教一起使用。根據(jù)上面的描述,構(gòu)造這類(lèi)系統(tǒng)所要求的結(jié)構(gòu)是顯而易見(jiàn)的。此外,本發(fā)明也不針對(duì)任何特定編程語(yǔ)言。應(yīng)當(dāng)明白,可以利用各種編程語(yǔ)言實(shí)現(xiàn)在此描述的本發(fā)明的內(nèi)容,并且上面對(duì)特定語(yǔ)言所做的描述是為了披露本發(fā)明的最佳實(shí)施方式。
在此處所提供的說(shuō)明書(shū)中,說(shuō)明了大量具體細(xì)節(jié)。然而,能夠理解,本發(fā)明的實(shí)施例可以在沒(méi)有這些具體細(xì)節(jié)的情況下實(shí)踐。在一些實(shí)例中,并未詳細(xì)示出公知的方法、結(jié)構(gòu)和技術(shù),以便不模糊對(duì)本說(shuō)明書(shū)的理解。
類(lèi)似地,應(yīng)當(dāng)理解,為了精簡(jiǎn)本公開(kāi)并幫助理解各個(gè)發(fā)明方面中的一個(gè)或多個(gè),在上面對(duì)本發(fā)明的示例性實(shí)施例的描述中,本發(fā)明的各個(gè)特征有時(shí)被一起分組到單個(gè)實(shí)施例、圖、或者對(duì)其的描述中。然而,并不應(yīng)將該公開(kāi)的方法解釋成反映如下意圖:即所要求保護(hù)的本發(fā)明要求比在每個(gè)權(quán)利要求中所明確記載的特征更多的特征。更確切地說(shuō),如下面的權(quán)利要求書(shū)所反映的那樣,發(fā)明方面在于少于前面公開(kāi)的單個(gè)實(shí)施例的所有特征。因此,遵循具體實(shí)施方式的權(quán)利要求書(shū)由此明確地并入該具體實(shí)施方式,其中每個(gè)權(quán)利要求本身都作為本發(fā)明的單獨(dú)實(shí)施例。
本領(lǐng)域那些技術(shù)人員可以理解,可以對(duì)實(shí)施例中的設(shè)備中的模塊進(jìn)行自適應(yīng)性地改變并且把它們?cè)O(shè)置在與該實(shí)施例不同的一個(gè)或多個(gè)設(shè)備中??梢园褜?shí)施例中的模塊或單元或組件組合成一個(gè)模塊或單元或組件,以及此外可以把它們分成多個(gè)子模塊或子單元或子組件。除了這樣的特征和/或過(guò)程或者單元中的至少一些是相互排斥之外,可以采用任何組合對(duì)本說(shuō)明書(shū)(包括伴隨的權(quán)利要求、摘要和附圖)中公開(kāi)的所有特征以及如此公開(kāi)的任何方法或者設(shè)備的所有過(guò)程或單元進(jìn)行組合。除非另外明確陳述,本說(shuō)明書(shū)(包括伴隨的權(quán)利要求、摘要和附圖)中公開(kāi)的每個(gè)特征可以由提供相同、等同或相似目的的替代特征來(lái)代替。
此外,本領(lǐng)域的技術(shù)人員能夠理解,盡管在此所述的一些實(shí)施例包括其它實(shí)施例中所包括的某些特征而不是其它特征,但是不同實(shí)施例的特征的組合意味著處于本發(fā)明的范圍之內(nèi)并且形成不同的實(shí)施例。例如,在下面的權(quán)利要求書(shū)中,所要求保護(hù)的實(shí)施例的任意之一都可以以任意的組合方式來(lái)使用。
本發(fā)明的各個(gè)部件實(shí)施例可以以硬件實(shí)現(xiàn),或者以在一個(gè)或者多個(gè)處理器上運(yùn)行的軟件模塊實(shí)現(xiàn),或者以它們的組合實(shí)現(xiàn)。本領(lǐng)域的技術(shù)人員應(yīng)當(dāng)理解,可以在實(shí)踐中使用微處理器或者數(shù)字信號(hào)處理器(DSP)來(lái)實(shí)現(xiàn)根據(jù)本發(fā)明實(shí)施例的消息隊(duì)列的消費(fèi)裝置中的一些或者全部部件的一些或者全部功能。本發(fā)明還可以實(shí)現(xiàn)為用于執(zhí)行這里所描述的方法的一部分或者全部的設(shè)備或者裝置程序(例如,計(jì)算機(jī)程序和計(jì)算機(jī)程序產(chǎn)品)。這樣的實(shí)現(xiàn)本發(fā)明的程序可以存儲(chǔ)在計(jì)算機(jī)可讀介質(zhì)上,或者可以具有一個(gè)或者多個(gè)信號(hào)的形式。這樣的信號(hào)可以從因特網(wǎng)網(wǎng)站上下載得到,或者在載體信號(hào)上提供,或者以任何其他形式提供。
應(yīng)該注意的是上述實(shí)施例對(duì)本發(fā)明進(jìn)行說(shuō)明而不是對(duì)本發(fā)明進(jìn)行限制,并且本領(lǐng)域技術(shù)人員在不脫離所附權(quán)利要求的范圍的情況下可設(shè)計(jì)出替換實(shí)施例。在權(quán)利要求中,不應(yīng)將位于括號(hào)之間的任何參考符號(hào)構(gòu)造成對(duì)權(quán)利要求的限制。單詞“包含”不排除存在未列在權(quán)利要求中的元件或步驟。位于元件之前的單詞“一”或“一個(gè)”不排除存在多個(gè)這樣的元件。本發(fā)明可以借助于包括有若干不同元件的硬件以及借助于適當(dāng)編程的計(jì)算機(jī)來(lái)實(shí)現(xiàn)。在列舉了若干裝置的單元權(quán)利要求中,這些裝置中的若干個(gè)可以是通過(guò)同一個(gè)硬件項(xiàng)來(lái)具體體現(xiàn)。單詞第一、第二、以及第三等的使用不表示任何順序??蓪⑦@些單詞解釋為名稱。
本發(fā)明公開(kāi)了:A1、一種消息對(duì)列的消費(fèi)方法,包括:
當(dāng)消費(fèi)任務(wù)啟動(dòng)時(shí),獲取所述消費(fèi)任務(wù)對(duì)應(yīng)的消息隊(duì)列的最舊數(shù)據(jù)偏移;
將所述消息隊(duì)列的最舊數(shù)據(jù)偏移與預(yù)先存儲(chǔ)的該消息隊(duì)列的當(dāng)前數(shù)據(jù)偏移進(jìn)行比較;
當(dāng)所述最舊數(shù)據(jù)偏移小于所述當(dāng)前數(shù)據(jù)偏移時(shí),根據(jù)所述當(dāng)前數(shù)據(jù)偏移讀取該消息隊(duì)列中的消息數(shù)據(jù);
每當(dāng)從所述消息隊(duì)列中讀取一條消息數(shù)據(jù)后,根據(jù)該條消息數(shù)據(jù)對(duì)應(yīng)的偏移地址更新所述預(yù)先存儲(chǔ)的該消息隊(duì)列的當(dāng)前數(shù)據(jù)偏移。
A2、根據(jù)A1所述的方法,其中,當(dāng)所述最舊數(shù)據(jù)偏移不小于所述當(dāng)前數(shù)據(jù)偏移時(shí),根據(jù)所述最舊數(shù)據(jù)偏移讀取該消息隊(duì)列中的消息數(shù)據(jù)。
A3、根據(jù)A1或A2所述的方法,其中,所述消息隊(duì)列具有多個(gè)消息分區(qū),且所述預(yù)先存儲(chǔ)的該消息隊(duì)列的當(dāng)前數(shù)據(jù)偏移包括:該消息隊(duì)列的各個(gè)消息分區(qū)的當(dāng)前數(shù)據(jù)偏移;
所述獲取所述消息隊(duì)列的最舊數(shù)據(jù)偏移具體為:分別獲取所述消息隊(duì)列的各個(gè)消息分區(qū)的最舊數(shù)據(jù)偏移;
所述將所述消息隊(duì)列的最舊數(shù)據(jù)偏移與預(yù)先存儲(chǔ)的該消息隊(duì)列的當(dāng)前數(shù)據(jù)偏移進(jìn)行比較的步驟具體為:分別將所述消息隊(duì)列的各個(gè)消息分區(qū)的最舊數(shù)據(jù)偏移與預(yù)先存儲(chǔ)的該消息隊(duì)列相應(yīng)的消息分區(qū)的當(dāng)前數(shù)據(jù)偏移進(jìn)行比較;
所述根據(jù)該條消息數(shù)據(jù)對(duì)應(yīng)的偏移地址更新所述存儲(chǔ)的該消息隊(duì)列的當(dāng)前數(shù)據(jù)偏移的步驟具體為:根據(jù)該條消息數(shù)據(jù)對(duì)應(yīng)的偏移地址更新該消息隊(duì)列相應(yīng)的消息分區(qū)的當(dāng)前數(shù)據(jù)偏移。
A4、根據(jù)A1-A3任一所述的方法,其中,所述根據(jù)該條消息數(shù)據(jù)對(duì)應(yīng)的偏移地址更新所述預(yù)先存儲(chǔ)的該消息隊(duì)列的當(dāng)前數(shù)據(jù)偏移的步驟具體包括:
創(chuàng)建用于更新當(dāng)前數(shù)據(jù)偏移的事務(wù),該事務(wù)包括:用于寫(xiě)入該條消息數(shù)據(jù)對(duì)應(yīng)的偏移地址的第一操作,以及用于寫(xiě)入該條消息數(shù)據(jù)的數(shù)據(jù)內(nèi)容的第二操作;
當(dāng)該事務(wù)中包含的第一操作和第二操作都執(zhí)行成功時(shí),向后臺(tái)數(shù)據(jù)庫(kù)提交該事務(wù);當(dāng)該事務(wù)中包含的第一操作和/或第二操作執(zhí)行失敗時(shí),回滾該事務(wù)。
A5、根據(jù)A1-A4任一所述的方法,其中,所述獲取所述消息隊(duì)列的最舊數(shù)據(jù)偏移的步驟具體包括:
與用于維護(hù)所述消息隊(duì)列的隊(duì)列服務(wù)器之間建立通信連接,通過(guò)所述通信連接獲取所述消息隊(duì)列的最舊數(shù)據(jù)偏移。
A6、根據(jù)A1-A5任一所述的方法,其中,所述消息隊(duì)列為分布式消息隊(duì)列。
本發(fā)明還公開(kāi)了:B7、一種消息對(duì)列的消費(fèi)裝置,包括:
獲取模塊,適于當(dāng)消費(fèi)任務(wù)啟動(dòng)時(shí),獲取所述消費(fèi)任務(wù)對(duì)應(yīng)的消息隊(duì)列的最舊數(shù)據(jù)偏移;
比較模塊,適于將所述消息隊(duì)列的最舊數(shù)據(jù)偏移與預(yù)先存儲(chǔ)的該消息隊(duì)列的當(dāng)前數(shù)據(jù)偏移進(jìn)行比較;
讀取模塊,適于當(dāng)所述最舊數(shù)據(jù)偏移小于所述當(dāng)前數(shù)據(jù)偏移時(shí),根據(jù)所述當(dāng)前數(shù)據(jù)偏移讀取該消息隊(duì)列中的消息數(shù)據(jù);
更新模塊,適于每當(dāng)從所述消息隊(duì)列中讀取一條消息數(shù)據(jù)后,根據(jù)該條消息數(shù)據(jù)對(duì)應(yīng)的偏移地址更新所述預(yù)先存儲(chǔ)的該消息隊(duì)列的當(dāng)前數(shù)據(jù)偏移。
B8、根據(jù)B7所述的裝置,其中,所述讀取模塊進(jìn)一步適于:當(dāng)所述最舊數(shù)據(jù)偏移不小于所述當(dāng)前數(shù)據(jù)偏移時(shí),根據(jù)所述最舊數(shù)據(jù)偏移讀取該消息隊(duì)列中的消息數(shù)據(jù)。
B9、根據(jù)B7或B8所述的裝置,其中,所述消息隊(duì)列具有多個(gè)消息分區(qū),且所述預(yù)先存儲(chǔ)的該消息隊(duì)列的當(dāng)前數(shù)據(jù)偏移包括:該消息隊(duì)列的各個(gè)消息分區(qū)的當(dāng)前數(shù)據(jù)偏移;
所述獲取模塊具體適于:分別獲取所述消息隊(duì)列的各個(gè)消息分區(qū)的最舊數(shù)據(jù)偏移;
所述比較模塊具體適于:分別將所述消息隊(duì)列的各個(gè)消息分區(qū)的最舊數(shù)據(jù)偏移與預(yù)先存儲(chǔ)的該消息隊(duì)列相應(yīng)的消息分區(qū)的當(dāng)前數(shù)據(jù)偏移進(jìn)行比較;
所述更新模塊具體適于:根據(jù)該條消息數(shù)據(jù)對(duì)應(yīng)的偏移地址更新該消息隊(duì)列相應(yīng)的消息分區(qū)的當(dāng)前數(shù)據(jù)偏移。
B10、根據(jù)B7-B9任一所述的裝置,其中,所述更新模塊具體適于:
創(chuàng)建用于更新當(dāng)前數(shù)據(jù)偏移的事務(wù),該事務(wù)包括:用于寫(xiě)入該條消息數(shù)據(jù)對(duì)應(yīng)的偏移地址的第一操作,以及用于寫(xiě)入該條消息數(shù)據(jù)的數(shù)據(jù)內(nèi)容的第二操作;
當(dāng)該事務(wù)中包含的第一操作和第二操作都執(zhí)行成功時(shí),向后臺(tái)數(shù)據(jù)庫(kù)提交該事務(wù);當(dāng)該事務(wù)中包含的第一操作和/或第二操作執(zhí)行失敗時(shí),回滾該事務(wù)。
B11、根據(jù)B7-B10任一所述的裝置,其中,所述獲取模塊具體適于:
與用于維護(hù)所述消息隊(duì)列的隊(duì)列服務(wù)器之間建立通信連接,通過(guò)所述通信連接獲取所述消息隊(duì)列的最舊數(shù)據(jù)偏移。
B12、根據(jù)B7-B11任一所述的裝置,其中,所述消息隊(duì)列為分布式消息隊(duì)列。