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