一種流計(jì)算應(yīng)用中實(shí)現(xiàn)持久化的方法及裝置制造方法
【專利摘要】本申請公開了一種流計(jì)算應(yīng)用中實(shí)現(xiàn)持久化的方法及裝置,包括當(dāng)前批次消息消費(fèi)成功,根據(jù)第一起始偏移量和預(yù)先設(shè)置的持久化間隔,判斷是否需要進(jìn)行持久化操作;在需要進(jìn)行持久化操作時,按照第二起始偏移量指示的消息位置進(jìn)行持久化處理,并在持久化成功后,將第一起始偏移量和第二起始偏移量均更新為下一批次消息的起始偏移量。本申請中的持久化操作是在持久化間隔后進(jìn)行的,增大了磁盤持久化的時間間隔,從而大大提高實(shí)時計(jì)算效率。在故障恢復(fù)時,最多只需要重新消費(fèi)持久化間隔內(nèi)的批次的消息,避免了現(xiàn)有同步持久化中頻繁寫磁盤帶來的性能瓶頸,實(shí)時計(jì)算的消息吞吐性能提升了一個數(shù)量級;同時,將故障恢復(fù)帶來的延遲縮短到了秒級,不會影響實(shí)時性。
【專利說明】一種流計(jì)算應(yīng)用中實(shí)現(xiàn)持久化的方法及裝置
【技術(shù)領(lǐng)域】
[0001]本申請涉及流計(jì)算技術(shù),尤指一種流計(jì)算應(yīng)用中是實(shí)現(xiàn)持久化的方法及裝置。
【背景技術(shù)】
[0002]通常,在流計(jì)算中將數(shù)據(jù)流稱為消息,而對數(shù)據(jù)流的一系列計(jì)算、處理稱為消費(fèi)。
[0003]流計(jì)算產(chǎn)品主要用于實(shí)時計(jì)算。實(shí)時計(jì)算通常在內(nèi)存中進(jìn)行,而計(jì)算結(jié)果要通過某種途徑保存并展現(xiàn)出來。目前,主要采用緩存或者持久化到磁盤如數(shù)據(jù)庫(非內(nèi)存數(shù)據(jù)庫)中兩種方式對計(jì)算結(jié)果進(jìn)行保存。其中,由于緩存方式?jīng)]有物理磁盤輸入/輸出(1/0),因此,緩存方式有著非常卓越的消息吞吐能力;但是,由于計(jì)算結(jié)果沒有持久化,緩存方式幾乎沒有容錯能力,也就是說,一旦出現(xiàn)應(yīng)用程序中斷、服務(wù)器宕機(jī)、緩存被清空等情況,保存在緩存中的計(jì)算結(jié)果將無法恢復(fù)。而采用持久化到磁盤中的方式,可以實(shí)現(xiàn)最高級別的容錯功能,但是,持久化到磁盤涉及到大量的磁盤寫,這又降低了流計(jì)算的計(jì)算速度,執(zhí)行效率大約比采用緩存的方式低一個數(shù)量級。
[0004]圖1為現(xiàn)有基本的容錯型流計(jì)算應(yīng)用中數(shù)據(jù)流向示意圖,如圖1所示,消息中間件集群發(fā)送的消息流是一條一條的。為了便于容錯,通常流計(jì)算產(chǎn)品如圖1中的流計(jì)算集群對消息流進(jìn)行消費(fèi)是以批次為單位的,即將若干條消息捆綁在一個批次中,每一個批次有一個唯一的標(biāo)識(瓜)。對于一個批次的消息,只有批次內(nèi)的每一條消息都被成功消費(fèi)后,這個批次的消息才被標(biāo)記為被成功消費(fèi);只要一個批次內(nèi)有一條消息沒有被消費(fèi)成功,整個批次的消息就會被消息中間件重新發(fā)送,被流計(jì)算集群重新消費(fèi)。
[0005]最終處理過的消息流存儲到磁盤稱之為持久化,這一步對于故障恢復(fù)是至關(guān)重要的。一旦出現(xiàn)應(yīng)用程序中斷、服務(wù)器宕機(jī)等情況,只有持久化操作才能保證實(shí)時計(jì)算的結(jié)果不丟失。故障恢復(fù)、實(shí)時計(jì)算應(yīng)用重啟時,需要重新從磁盤中加載實(shí)時計(jì)算的過程數(shù)據(jù)與結(jié)果數(shù)據(jù),將所有狀態(tài)恢復(fù)到故障發(fā)生之前的一個正確的時間點(diǎn)。在圖1^^^ 2001(661)61集群中存儲有消息中間件集群發(fā)送的消息所在的消息隊(duì)列的偏移量。當(dāng)消息中間件集群發(fā)送給流計(jì)算集群一批消息時,2001(661)61-中會記錄這批次的消息在消息隊(duì)列中的起始偏移量。如果這批次的消息被流計(jì)算集群成功消費(fèi),那么,消息中間件集群會發(fā)送下一批次消息,2001(661)61-中記錄的偏移量隨之更新為下一批次消息在消息隊(duì)列中的起始偏移量;如果這批次消息被消費(fèi)失敗,那么,流計(jì)算集群會從2001(661)61集群中重新讀取這批次消息的偏移量,然后到消息中間件集群中重新請求該批次消息,以實(shí)現(xiàn)消息的失敗重發(fā)。
【發(fā)明內(nèi)容】
[0006]為了解決上述技術(shù)問題,本申請?zhí)峁┝艘环N流計(jì)算應(yīng)用中實(shí)現(xiàn)持久化的方法及裝置,能夠保證故障后數(shù)據(jù)的安全恢復(fù),提高實(shí)時計(jì)算效率。
[0007]為了達(dá)到本申請目的,本申請?zhí)峁┮环N流計(jì)算應(yīng)用中實(shí)現(xiàn)持久化的方法,包括:
[0008]當(dāng)前批次消息消費(fèi)成功,根據(jù)用于保存當(dāng)前正在消費(fèi)的批次消息在消息隊(duì)列中的起始位置的第一起始偏移量和預(yù)先設(shè)置的持久化間隔,判斷是否需要進(jìn)行持久化操作;
[0009]在需要進(jìn)行持久化操作時,按照用于保存最近一次持久化操作的下一批次消息在消息隊(duì)列中的起始位置的第二起始偏移量指示的消息位置進(jìn)行持久化處理;
[0010]持久化操作成功后,分別更新第一起始偏移量和第二起始偏移量為下一批次消息的起始偏移量。
[0011]所述流計(jì)算應(yīng)用正常啟動,或者故障恢復(fù)后啟動時,該方法還包括:
[0012]根據(jù)所述第二起始偏移量請求消息,同時將所述第一起始偏移量的值更改為第二起始偏移量的值。
[0013]所述第二起始偏移量的值為空或者未保存有第二起始偏移量時,所述當(dāng)前批次消息位于消息中間件的消息隊(duì)列的起始位置;
[0014]同時還包括:設(shè)置所述第一起始偏移量的值為空。
[0015]所述持久化操作失敗,該方法還包括:按照所述第一起始偏移量指示,重新對所述當(dāng)前批次消息中的消息進(jìn)行消費(fèi)。
[0016]所述判斷是否需要進(jìn)行持久化操作包括:將所述當(dāng)前批次的10除以持久化間隔,當(dāng)其余數(shù)為零時,判斷出需要進(jìn)行持久化操作;
[0017]其中,批次10為從1開始以遞增步長為1的整數(shù)。
[0018]所述流計(jì)算應(yīng)用正常啟動,或者故障恢復(fù)后啟動時,所述批次10接著流計(jì)算應(yīng)用停止前的最后一個成功持久化過的批次10繼續(xù)遞增步長為1遞增。
[0019]本申請還公開一種流計(jì)算應(yīng)用中實(shí)現(xiàn)持久化的裝置,至少存儲模塊、判斷模塊,以及處理模塊,其中,
[0020]存儲模塊,其中保存有持久化間隔、用于保存當(dāng)前正在消費(fèi)的批次消息在消息隊(duì)列中的起始位置的第一起始偏移量,以及用于保存最近一次持久化操作的下一批次消息在消息隊(duì)列中的起始位置的第二起始偏移量;
[0021]判斷模塊,當(dāng)前批次消息消費(fèi)成功,根據(jù)存儲模塊中保存的第一起始偏移量和預(yù)先設(shè)置的持久化間隔,判斷出需要進(jìn)行持久化操作時向處理模塊發(fā)送持久化通知;
[0022]處理模塊,接收到來自判斷模塊的持久化通知,按照存儲模塊中保存的第二起始偏移量指示的消息位置進(jìn)行持久化操作;并在持久化操作成功后,將第一起始偏移量和第二起始偏移量均更新為下一批次消息的起始偏移量。
[0023]所述處理模塊進(jìn)一步用于:
[0024]在流計(jì)算應(yīng)用正常啟動,或者故障恢復(fù)后啟動時,根據(jù)所述存儲模塊中保存的第二起始偏移量從消息中間件中請求消息,同時將所述存儲模塊中保存的第一起始偏移量的值更改為第二起始偏移量的值。
[0025]所述處理模塊還進(jìn)一步用于,在所述持久化操作失敗時,按照所述存儲模塊中保存的第一起始偏移量指示,重新對從消息中間件中當(dāng)前批次消息中的消息進(jìn)行消費(fèi)。
[0026]所述判斷模塊具體用于:將所述第一起始偏移量所指示的當(dāng)前批次的10除以所述持久化間隔,當(dāng)其余數(shù)為零時,判斷出需要進(jìn)行持久化操作,向所述處理模塊發(fā)送持久化通知;其中,批次10為從1開始以遞增步長為1的整數(shù)。
[0027]本申請?zhí)峁┑姆桨赴ó?dāng)前批次消息消費(fèi)成功,根據(jù)用于保存當(dāng)前正在消費(fèi)的批次消息在消息隊(duì)列中的起始位置的第一起始偏移量和預(yù)先設(shè)置的持久化間隔,判斷是否需要進(jìn)行持久化操作;在需要進(jìn)行持久化操作時,按照用于保存最近一次持久化操作的下一批次消息在消息隊(duì)列中的起始位置的第二起始偏移量指示的消息位置進(jìn)行持久化處理,并在持久化成功后,將第一起始偏移量和第二起始偏移量均更新為下一批次消息的起始偏移量。本申請中的持久化操作不是針對每個批次成功消費(fèi)后都要進(jìn)行的,而是在一個預(yù)先設(shè)置的時間間隔即持久化間隔后進(jìn)行的,增大了磁盤持久化的時間間隔,從而大大提高實(shí)時計(jì)算效率。這樣,在故障恢復(fù)時,最多只需要重新消費(fèi)持久化間隔內(nèi)的批次的消息,與現(xiàn)有同步持久化相比,避免了同步持久化方案中頻繁寫磁盤帶來的性能瓶頸,實(shí)時計(jì)算的消息吞吐性能提升了一個數(shù)量級,而且達(dá)到了與緩存方式的方案在同一個數(shù)量級;同時,將故障恢復(fù)帶來的延遲縮短到了秒級,不會影響實(shí)時性。
[0028]本申請的其它特征和優(yōu)點(diǎn)將在隨后的說明書中闡述,并且,部分地從說明書中變得顯而易見,或者通過實(shí)施本申請而了解。本申請的目的和其他優(yōu)點(diǎn)可通過在說明書、權(quán)利要求書以及附圖中所特別指出的結(jié)構(gòu)來實(shí)現(xiàn)和獲得。
【專利附圖】
【附圖說明】
[0029]附圖用來提供對本申請技術(shù)方案的進(jìn)一步理解,并且構(gòu)成說明書的一部分,與本申請的實(shí)施例一起用于解釋本申請的技術(shù)方案,并不構(gòu)成對本申請技術(shù)方案的限制。
[0030]圖1為現(xiàn)有基本的容錯型流計(jì)算應(yīng)用中數(shù)據(jù)流向的示意圖;
[0031]圖2為本申請流計(jì)算應(yīng)用中實(shí)現(xiàn)持久化的方法的流程圖;
[0032]圖3為本申請流計(jì)算應(yīng)用中實(shí)現(xiàn)持久化的實(shí)施例的流程示意圖;
[0033]圖4為本申請流計(jì)算應(yīng)用中實(shí)現(xiàn)持久化的裝置的組成結(jié)構(gòu)示意圖。
【具體實(shí)施方式】
[0034]為使本申請的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚明白,下文中將結(jié)合附圖對本申請的實(shí)施例進(jìn)行詳細(xì)說明。需要說明的是,在不沖突的情況下,本申請中的實(shí)施例及實(shí)施例中的特征可以相互任意組合。
[0035]在本申請一個典型的配置中,計(jì)算設(shè)備包括一個或多個處理器(⑶們、輸入/輸出接口、網(wǎng)絡(luò)接口和內(nèi)存。
[0036]內(nèi)存可能包括計(jì)算機(jī)可讀介質(zhì)中的非永久性存儲器,隨機(jī)存取存儲器(狀1)和/或非易失性內(nèi)存等形式,如只讀存儲器(801)或閃存內(nèi)存是計(jì)算機(jī)可讀介質(zhì)的示例。
[0037]計(jì)算機(jī)可讀介質(zhì)包括永久性和非永久性、可移動和非可移動媒體可以由任何方法或技術(shù)來實(shí)現(xiàn)信息存儲。信息可以是計(jì)算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序的模塊或其他數(shù)據(jù)。計(jì)算機(jī)的存儲介質(zhì)的例子包括,但不限于相變內(nèi)存靜態(tài)隨機(jī)存取存儲器動態(tài)隨機(jī)存取存儲器其他類型的隨機(jī)存取存儲器(狀…、只讀存儲器(如…、電可擦除可編程只讀存儲器⑶即如…、快閃記憶體或其他內(nèi)存技術(shù)、只讀光盤只讀存儲器
(0)-801)、數(shù)字多功能光盤(1^0 )或其他光學(xué)存儲、磁盒式磁帶,磁帶磁磁盤存儲或其他磁性存儲設(shè)備或任何其他非傳輸介質(zhì),可用于存儲可以被計(jì)算設(shè)備訪問的信息。按照本文中的界定,計(jì)算機(jī)可讀介質(zhì)不包括非暫存電腦可讀媒體“1^11811:01*7 1116(1121),如調(diào)制的數(shù)據(jù)信號和載波。
[0038]在附圖的流程圖示出的步驟可以在諸如一組計(jì)算機(jī)可執(zhí)行指令的計(jì)算機(jī)系統(tǒng)中執(zhí)行。并且,雖然在流程圖中示出了邏輯順序,但是在某些情況下,可以以不同于此處的順序執(zhí)行所示出或描述的步驟。
[0039]目前,容錯型流計(jì)算方案大致有以下幾種:
[0040]一種是,將實(shí)時計(jì)算結(jié)果寫入緩存,通過部署兩套相同的計(jì)算集群來實(shí)現(xiàn)容災(zāi)。這種方式的優(yōu)點(diǎn)是,由于沒有磁盤1/0,執(zhí)行效率快,并發(fā)訪問性能高;但是缺點(diǎn)也是顯而易見的,即部署成本翻倍,而且如果兩套計(jì)算集群同時出現(xiàn)故障,計(jì)算結(jié)果仍然會丟失。
[0041]另一種是,啟動一個實(shí)時計(jì)算應(yīng)用以完成正常的業(yè)務(wù)計(jì)算功能,并將實(shí)時計(jì)算結(jié)果寫緩存;同時,開啟另外一個獨(dú)立的實(shí)時計(jì)算應(yīng)用以將接收到的原始消息持久化到磁盤中。由于持久化到磁盤的應(yīng)用與完成業(yè)務(wù)計(jì)算的應(yīng)用相互獨(dú)立,因此,可以實(shí)現(xiàn)高執(zhí)行效率。當(dāng)出現(xiàn)集群宕機(jī)等故障時,在故障恢復(fù)時,需要對備份在磁盤中的消息進(jìn)行重新消費(fèi),雖然不會造成數(shù)據(jù)丟失,但是,當(dāng)消息量非常大時,故障恢復(fù)的過程導(dǎo)致了實(shí)時計(jì)算應(yīng)用的嚴(yán)重延遲,從而失去了實(shí)時的價值。
[0042]還有一種是,在第二種方案的基礎(chǔ)上進(jìn)行改進(jìn),采用同步持久化的方法,即實(shí)時計(jì)算應(yīng)用在消費(fèi)每批次消息時,都將實(shí)時計(jì)算結(jié)果(不是原始消息,而是經(jīng)過消費(fèi)加工后的消息)持久化到磁盤中,而且,只有當(dāng)對該批次的消費(fèi)以及持久化操作全部成功后,消息中間件集群才會發(fā)送下一批次的消息。這種方式是目前通用的用于故障恢復(fù)的流計(jì)算方案。具體來講,
[0043]同步持久化,就是每一個批次都要做一次寫磁盤的操作。如圖1所示,保存在2001(661)61-集群中的偏移量會隨著對一個批次消息的成功消費(fèi)而更新為下一個批次消息所在消息隊(duì)列的起始位置。如果不做同步持久化,一旦發(fā)生應(yīng)用中斷、集群宕機(jī)等情況,在故障恢復(fù)、應(yīng)用重啟之后,將有部分?jǐn)?shù)據(jù)丟失。舉例來說,假設(shè)實(shí)時應(yīng)用在成功消費(fèi)完第丁批次的消息后,沒有進(jìn)行持久化,將這批次的計(jì)算結(jié)果保存到磁盤中,而接著消費(fèi)第01+1)批次的消息,此時保存在200匕印61'集群中的偏移量已經(jīng)更新為第(1+1)批次消息所在消息隊(duì)列的起始位置。如果此時發(fā)生服務(wù)器宕機(jī),在故障恢復(fù)、應(yīng)用重啟后,實(shí)時應(yīng)用從200^661361-集群中獲得偏移量并到消息中間件集群中去請求消息,顯然,這時請求到的是第(1+1)批次的消息;而之前第I批次的消息沒有保存在磁盤中(即未執(zhí)行同步持久化),必然導(dǎo)致第I批次消息的丟失。
[0044]在同步持久化方案中,由于每個批次都要做一次寫磁盤的操作,而批次的發(fā)送時間間隔大約在400毫秒?2秒之間,實(shí)時應(yīng)用對每個批次消息在內(nèi)存中計(jì)算花費(fèi)的時間大約在1秒鐘以內(nèi)。這樣,磁盤寫的頻率會非常頻繁。根據(jù)大量經(jīng)驗(yàn)可以知道,每批次磁盤寫花費(fèi)的時間占整個批次消費(fèi)所花費(fèi)的總時間的比重達(dá)到了 50%或更多,磁盤寫成為了影響實(shí)時計(jì)算效率的主要瓶頸。
[0045]圖2為本申請流計(jì)算應(yīng)用中實(shí)現(xiàn)持久化的方法的流程圖,如圖2所示,包括以下步驟:
[0046]步驟200:當(dāng)前批次消息消費(fèi)成功,根據(jù)用于保存當(dāng)前正在消費(fèi)的批次消息在消息隊(duì)列中的起始位置的第一起始偏移量和預(yù)先設(shè)置的持久化間隔,判斷是否需要進(jìn)行持久化操作。
[0047]本步驟中,對當(dāng)前批次消息的消費(fèi)屬于現(xiàn)有技術(shù),具體實(shí)現(xiàn)并不屬于本申請的保護(hù)范圍,這里不再贅述。
[0048]本步驟中,持久化間隔~是預(yù)先設(shè)置的一個大于1的整數(shù),比如50。通常,可以將持久化間隔~設(shè)置為10到100之間的一個整數(shù)。
[0049]本步驟中的判斷是否需要進(jìn)行持久化操作包括:將當(dāng)前批次的10除以持久化間隔I當(dāng)其余數(shù)為零時,判斷出需要進(jìn)行持久化操作。其中,批次10是從1開始遞增步長為1的整數(shù)。
[0050]從本步驟可見,本申請中的持久化操作不是針對每個批次成功消費(fèi)后都要進(jìn)行的,而是在一個間隔即持久化間隔~后進(jìn)行的。這樣,在故障恢復(fù)時,最多只需要重新消費(fèi)~個批次的消息,與現(xiàn)有同步持久化相比,避免了同步持久化方案中頻繁寫磁盤帶來的性能瓶頸,實(shí)時計(jì)算的消息吞吐性能提升了一個數(shù)量級,而且達(dá)到了與不做持久化的方案如緩存方式在同一個數(shù)量級,同時,將故障恢復(fù)帶來的延遲縮短到了秒級。
[0051]步驟201:在需要進(jìn)行持久化操作時,按照用于保存最近一次持久化操作的下一批次消息在消息隊(duì)列中的起始位置的第二起始偏移量指示的消息位置進(jìn)行持久化處理。
[0052]持久化處理就是流計(jì)算應(yīng)用從第二起始偏移量指示的消息位置,將數(shù)據(jù)緩沖中的計(jì)算結(jié)果數(shù)據(jù)寫入到磁盤中。具體實(shí)現(xiàn)屬于本領(lǐng)域技術(shù)人員的慣用技術(shù)手段,所不同的是,這里需要持久化的計(jì)算結(jié)果是由第二起始偏移量指示的,而第二起始偏移量保存的是最近一次持久化操作的下一批次消息在消息隊(duì)列中的起始位置,也就是說,持久化的是從上一次持久化成功后的批次開始,包括持久化間隔~的批次消息在數(shù)據(jù)緩沖中的計(jì)算結(jié)果。即本申請中的持久化操作不是每個批次成功消費(fèi)后都要進(jìn)行的,而是在一個批次間隔即持久化間隔^的。
[0053]步驟202:持久化成功后,第一起始偏移量和第二起始偏移量均更新為下一批次消息的起始偏移量。本步驟的更新過程,保證了下一次持久化處理從未持久化處理的成功消費(fèi)的批次消息開始。
[0054]在流計(jì)算應(yīng)用正常啟動,或者故障恢復(fù)后啟動時,本申請方法還包括:根據(jù)第二起始偏移量請求消息,同時將第一起始偏移量的值更改為第二起始偏移量的值。此時,如果第二起始偏移量的值為空或者未保存有第二起始偏移量,則從消息中間件的消息隊(duì)列的起始位置開始請求消息,同時第一起始偏移量的值設(shè)置為空。
[0055]同時,流計(jì)算應(yīng)用正常啟動,或者故障恢復(fù)后啟動時,批次10可以接著應(yīng)用停止前的最后一個成功持久化過的批次10繼續(xù)遞增,而不是重新從1開始遞增。以保證批次10對于同一個實(shí)時應(yīng)用的唯一性。
[0056]如果持久化操作失敗,本申請方法還包括:按照第一起始偏移量指示,重新對當(dāng)前批次消息中的消息進(jìn)行消費(fèi)。
[0057]下面結(jié)合實(shí)施例對本發(fā)明方法進(jìn)行詳細(xì)描述。圖3為本申請流計(jì)算應(yīng)用中實(shí)現(xiàn)持久化的實(shí)施例的流程示意圖,本實(shí)施例中以8丨0;011作為流計(jì)算框架,使用扣妨語言開發(fā)流計(jì)算應(yīng)用,并以圖1所示容錯型流計(jì)算應(yīng)用為例進(jìn)行描述,如圖3所示,包括:
[0058]步驟300?步驟301:流計(jì)算應(yīng)用啟動如正常啟動或故障恢復(fù)后啟動,從2001(661)61'中讀取第二起始偏移量,然后按照第二起始偏移量指示的消息位置到消息中間件中去請求消息,同時,將2001(661)61中的第一起始偏移量的值更改為讀取的第二起始偏移量的值。
[0059]本步驟中,如果2001(6^61中沒有保存第二起始偏移量或者其值為空,那么,從消息中間件的消息隊(duì)列的起始位置開始請求消息,同時將2001(661)61中的第一起始偏移量的值設(shè)置為空。
[0060]步驟302:到消息中間件中請求消息。
[0061]步驟303:流計(jì)算集群的計(jì)算單元對接收到的當(dāng)前批次消息進(jìn)行消費(fèi),如果消費(fèi)失敗,進(jìn)入步驟308 ;否則進(jìn)入步驟304。
[0062]步驟304:對當(dāng)前批次消息的成功消費(fèi)后,判斷當(dāng)前批次10除以預(yù)先設(shè)置的持久化間隔~后得到的余數(shù)是否等于0。如果不等于0,說明此時還不需要進(jìn)行持久化,進(jìn)入步驟309 ;否則進(jìn)入步驟305。
[0063]步驟305:在需要進(jìn)行持久化操作時,進(jìn)行持久化處理并將實(shí)時計(jì)算結(jié)果保存到磁盤中。
[0064]步驟306:判斷持久化操作是否成功,如果成功進(jìn)入步驟307 ;如果失敗進(jìn)入步驟310。其中,判斷持久化是否成功屬于本領(lǐng)域技術(shù)人員的慣用技術(shù)手段,通常數(shù)據(jù)庫軟件會提供給用戶持久化的接口,調(diào)用接口后通過返回碼來判斷持久化是否成功即可。
[0065]步驟307:持久化操作成功,從消息中間件中獲得下一批次消息的起始偏移量,同時將該偏移量保存為第一起始偏移量和第二起始偏移量,之后返回步驟302。
[0066]步驟308:如果對當(dāng)前消息消費(fèi)失敗,從200X661)61'中重新讀取第一起始偏移量后返回步驟302。如果此時第一起始偏移量的值為空,則返回步驟302并從消息中間件的消息隊(duì)列的起始位置開始請求消息。
[0067]步驟309:在不需要進(jìn)行持久化操作時,從消息中間件中獲取下一批次消息的起始偏移量,同時將該偏移量保存為第一起始偏移量后返回步驟302,繼續(xù)對消息進(jìn)行消費(fèi)。
[0068]步驟310:如果持久化操作失敗,從2001(661)6:^中重新讀取第一起始偏移量后返回步驟302。
[0069]圖3所示流程在流計(jì)算應(yīng)用接收到終止命令時停止。
[0070]圖4為本申請流計(jì)算應(yīng)用中實(shí)現(xiàn)持久化的裝置的組成結(jié)構(gòu)示意圖,如圖4所示,至少包括存儲模塊、判斷模塊,以及處理模塊,其中,
[0071]存儲模塊,其中保存有持久化間隔、用于保存當(dāng)前正在消費(fèi)的批次消息在消息隊(duì)列中的起始位置的第一起始偏移量,以及用于保存最近一次持久化操作的下一批次消息在消息隊(duì)列中的起始位置的第二起始偏移量;
[0072]判斷模塊,當(dāng)前批次消息消費(fèi)成功,根據(jù)存儲模塊中保存的第一起始偏移量和預(yù)先設(shè)置的持久化間隔,判斷出需要進(jìn)行持久化操作時向處理模塊發(fā)送持久化通知;具體用于,將第一起始偏移量所指示的當(dāng)前批次的10除以持久化間隔,當(dāng)其余數(shù)為零時,判斷出需要進(jìn)行持久化操作;其中,批次10為從1開始以遞增步長為1的整數(shù)。
[0073]處理模塊,接收到來自判斷模塊的持久化通知,按照存儲模塊中保存的第二起始偏移量指示的消息位置進(jìn)行持久化處理;并在持久化成功后,將第一起始偏移量和第二起始偏移量均更新為下一批次消息的起始偏移量。
[0074]處理模塊進(jìn)一步用于:在流計(jì)算應(yīng)用正常啟動,或者故障恢復(fù)后啟動時,根據(jù)存儲模塊中保存的第二起始偏移量從消息中間件中請求消息,同時將存儲模塊中保存的第一起始偏移量的值更改為第二起始偏移量的值。
[0075]處理模塊還進(jìn)一步用于,在持久化操作失敗時,按照存儲模塊中保存的第一起始偏移量指示,重新對從消息中間件中當(dāng)前批次消息中的消息進(jìn)行消費(fèi)。
[0076]以圖1所示架構(gòu)為例,本申請裝置中的存儲模塊可以設(shè)置在2001(661)61中,判斷模塊和處理模塊可以設(shè)置在流計(jì)算集群中。在實(shí)際應(yīng)用中,也中可以使用其他軟件替代2001(661)61-,比如1182186 5 178(11等;或者,將存儲模塊設(shè)置在消息中間件中實(shí)現(xiàn)等。
[0077]本領(lǐng)域的技術(shù)人員應(yīng)該明白,上述的本申請實(shí)施例所提供的裝置的各組成部分,以及方法中的各步驟,它們可以集中在單個的計(jì)算裝置上,或者分布在多個計(jì)算裝置所組成的網(wǎng)絡(luò)上??蛇x地,它們可以用計(jì)算裝置可執(zhí)行的程序代碼來實(shí)現(xiàn)。從而,可以將它們存儲在存儲裝置中由計(jì)算裝置來執(zhí)行,或者將它們分別制作成各個集成電路模塊,或者將它們中的多個模塊或步驟制作成單個集成電路模塊來實(shí)現(xiàn)。這樣,本申請不限制于任何特定的硬件和軟件結(jié)合。
[0078]雖然本申請所揭露的實(shí)施方式如上,但所述的內(nèi)容僅為便于理解本申請而采用的實(shí)施方式,并非用以限定本申請。任何本申請所屬領(lǐng)域內(nèi)的技術(shù)人員,在不脫離本申請所揭露的精神和范圍的前提下,可以在實(shí)施的形式及細(xì)節(jié)上進(jìn)行任何的修改與變化,但本申請的專利保護(hù)范圍,仍須以所附的權(quán)利要求書所界定的范圍為準(zhǔn)。
【權(quán)利要求】
1.一種流計(jì)算應(yīng)用中實(shí)現(xiàn)持久化的方法,其特征在于,包括: 當(dāng)前批次消息消費(fèi)成功,根據(jù)用于保存當(dāng)前正在消費(fèi)的批次消息在消息隊(duì)列中的起始位置的第一起始偏移量和預(yù)先設(shè)置的持久化間隔,判斷是否需要進(jìn)行持久化操作; 在需要進(jìn)行持久化操作時,按照用于保存最近一次持久化操作的下一批次消息在消息隊(duì)列中的起始位置的第二起始偏移量指示的消息位置進(jìn)行持久化處理; 持久化操作成功后,分別更新第一起始偏移量和第二起始偏移量為下一批次消息的起始偏移量。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述流計(jì)算應(yīng)用正常啟動,或者故障恢復(fù)后啟動時,該方法還包括: 根據(jù)所述第二起始偏移量請求消息,同時將所述第一起始偏移量的值更改為第二起始偏移量的值。
3.根據(jù)權(quán)利要求2所述的方法,其特征在于,所述第二起始偏移量的值為空或者未保存有第二起始偏移量時,所述當(dāng)前批次消息位于消息中間件的消息隊(duì)列的起始位置; 同時還包括:設(shè)置所述第一起始偏移量的值為空。
4.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述持久化操作失敗,該方法還包括:按照所述第一起始偏移量指示,重新對所述當(dāng)前批次消息中的消息進(jìn)行消費(fèi)。
5.根據(jù)權(quán)利要求2或4所述的方法,其特征在于,所述判斷是否需要進(jìn)行持久化操作包括:將所述當(dāng)前批次的ID除以持久化間隔,當(dāng)其余數(shù)為零時,判斷出需要進(jìn)行持久化操作; 其中,批次ID為從I開始以遞增步長為I的整數(shù)。
6.根據(jù)權(quán)利要求5所述的方法,其特征在于,所述流計(jì)算應(yīng)用正常啟動,或者故障恢復(fù)后啟動時,所述批次ID接著流計(jì)算應(yīng)用停止前的最后一個成功持久化過的批次ID繼續(xù)遞增步長為I遞增。
7.一種流計(jì)算應(yīng)用中實(shí)現(xiàn)持久化的裝置,其特征在于,至少存儲模塊、判斷模塊,以及處理模塊,其中, 存儲模塊,其中保存有持久化間隔、用于保存當(dāng)前正在消費(fèi)的批次消息在消息隊(duì)列中的起始位置的第一起始偏移量,以及用于保存最近一次持久化操作的下一批次消息在消息隊(duì)列中的起始位置的第二起始偏移量; 判斷模塊,當(dāng)前批次消息消費(fèi)成功,根據(jù)存儲模塊中保存的第一起始偏移量和預(yù)先設(shè)置的持久化間隔,判斷出需要進(jìn)行持久化操作時向處理模塊發(fā)送持久化通知; 處理模塊,接收到來自判斷模塊的持久化通知,按照存儲模塊中保存的第二起始偏移量指示的消息位置進(jìn)行持久化操作;并在持久化操作成功后,將第一起始偏移量和第二起始偏移量均更新為下一批次消息的起始偏移量。
8.根據(jù)權(quán)利要求7所述的裝置,其特征在于,所述處理模塊進(jìn)一步用于: 在流計(jì)算應(yīng)用正常啟動,或者故障恢復(fù)后啟動時,根據(jù)所述存儲模塊中保存的第二起始偏移量從消息中間件中請求消息,同時將所述存儲模塊中保存的第一起始偏移量的值更改為第二起始偏移量的值。
9.根據(jù)權(quán)利要求7所述的裝置,其特征在于,所述處理模塊還進(jìn)一步用于,在所述持久化操作失敗時,按照所述存儲模塊中保存的第一起始偏移量指示,重新對從消息中間件中當(dāng)前批次消息中的消息進(jìn)行消費(fèi)。
10.根據(jù)權(quán)利要求7?9任一項(xiàng)所述的裝置,其特征在于,所述判斷模塊具體用于:將所述第一起始偏移量所指示的當(dāng)前批次的ID除以所述持久化間隔,當(dāng)其余數(shù)為零時,判斷出需要進(jìn)行持久化操作,向所述處理模塊發(fā)送持久化通知;其中,批次ID為從I開始以遞增步長為I的整數(shù)。
【文檔編號】G06F17/30GK104424186SQ201310362269
【公開日】2015年3月18日 申請日期:2013年8月19日 優(yōu)先權(quán)日:2013年8月19日
【發(fā)明者】劉健男 申請人:阿里巴巴集團(tuán)控股有限公司