本申請(qǐng)涉及數(shù)據(jù)處理
技術(shù)領(lǐng)域:
,尤其涉及一種扣減庫(kù)存數(shù)據(jù)的方法和裝置。
背景技術(shù):
:電子商務(wù)是當(dāng)下互聯(lián)網(wǎng)行業(yè)炙手可熱的領(lǐng)域,它既是一個(gè)市場(chǎng),也是一種拓展渠道。電商、電商平臺(tái)經(jīng)常組織各種優(yōu)惠活動(dòng)來(lái)回饋用戶,同時(shí)擴(kuò)大自身的影響力。在這些優(yōu)惠活動(dòng)中,經(jīng)常發(fā)生很多用戶搶購(gòu)個(gè)別商品的情形。例如,在活動(dòng)開始后,大規(guī)模購(gòu)買商品A的請(qǐng)求并發(fā)發(fā)生,處理每個(gè)請(qǐng)求時(shí)都需要扣減數(shù)據(jù)庫(kù)中商品A的庫(kù)存總量,如果庫(kù)存扣減到零,則請(qǐng)求被拒絕。在數(shù)據(jù)庫(kù)中更新商品A的庫(kù)存總量時(shí),要先對(duì)被更新的庫(kù)存總量加鎖,等到更新完畢解鎖后,才能接受對(duì)該數(shù)據(jù)的其他更新請(qǐng)求。發(fā)生大量對(duì)單點(diǎn)數(shù)據(jù)的并發(fā)更新請(qǐng)求時(shí),直接更新數(shù)據(jù)庫(kù)中數(shù)據(jù)的方法不能滿足性能要求?,F(xiàn)有技術(shù)中,將庫(kù)存總量分配到一臺(tái)或多臺(tái)電腦或服務(wù)器的內(nèi)存中,在收到庫(kù)存更新請(qǐng)求時(shí),扣減內(nèi)存中的庫(kù)存量,不必訪問(wèn)數(shù)據(jù)庫(kù),從而提高了響應(yīng)速度。但是,一旦遇到機(jī)器故障,例如宕機(jī)、死機(jī)或者程序異常終止,內(nèi)存中的數(shù)據(jù)丟失,會(huì)導(dǎo)致庫(kù)存數(shù)據(jù)和交易數(shù)據(jù)不一致,給用戶和商戶帶來(lái)不便。技術(shù)實(shí)現(xiàn)要素:有鑒于此,本申請(qǐng)?zhí)峁┮环N扣減庫(kù)存數(shù)據(jù)的方法,應(yīng)用在保存有總庫(kù)存 量的后臺(tái)實(shí)例上,包括:導(dǎo)入總庫(kù)存量的至少部分值到前臺(tái)實(shí)例的內(nèi)存,保存前臺(tái)實(shí)例的導(dǎo)入記錄,包括導(dǎo)入后前臺(tái)實(shí)例的本次初始庫(kù)存和導(dǎo)入時(shí)序標(biāo)簽;保存前臺(tái)實(shí)例的出庫(kù)記錄,包括出庫(kù)數(shù)量和出庫(kù)時(shí)序標(biāo)簽;當(dāng)前臺(tái)實(shí)例發(fā)生故障時(shí),根據(jù)導(dǎo)入時(shí)序標(biāo)簽和出庫(kù)時(shí)序標(biāo)簽確定扣減本次初始庫(kù)存的出庫(kù)數(shù)量,按照所確定的出庫(kù)數(shù)量和本次初始庫(kù)存更新總庫(kù)存量。本申請(qǐng)?zhí)峁┑囊环N扣減庫(kù)存數(shù)據(jù)的方法,應(yīng)用在前臺(tái)實(shí)例上,包括:從后臺(tái)實(shí)例導(dǎo)入總庫(kù)存量的至少部分值到內(nèi)存,將導(dǎo)入后本實(shí)例的本次初始庫(kù)存返回給后臺(tái)實(shí)例;將每筆出庫(kù)的出庫(kù)數(shù)量通知后臺(tái)實(shí)例;向后臺(tái)實(shí)例發(fā)送心跳通知,供后臺(tái)實(shí)例檢測(cè)本實(shí)例是否發(fā)生故障,并在發(fā)生故障時(shí)根據(jù)本次初始庫(kù)存和出庫(kù)數(shù)量更新總庫(kù)存量。本申請(qǐng)還提供了一種扣減庫(kù)存數(shù)據(jù)的裝置,應(yīng)用在保存有總庫(kù)存量的后臺(tái)實(shí)例上,包括:分庫(kù)存導(dǎo)入及記錄單元,用于導(dǎo)入總庫(kù)存量的至少部分值到前臺(tái)實(shí)例的內(nèi)存,保存前臺(tái)實(shí)例的導(dǎo)入記錄,包括導(dǎo)入后前臺(tái)實(shí)例的本次初始庫(kù)存和導(dǎo)入時(shí)序標(biāo)簽;出庫(kù)記錄保存單元,用于保存前臺(tái)實(shí)例的出庫(kù)記錄,包括出庫(kù)數(shù)量和出庫(kù)時(shí)序標(biāo)簽;總庫(kù)存更新單元,用于當(dāng)前臺(tái)實(shí)例發(fā)生故障時(shí),根據(jù)導(dǎo)入時(shí)序標(biāo)簽和出庫(kù)時(shí)序標(biāo)簽確定扣減本次初始庫(kù)存的出庫(kù)數(shù)量,按照所確定的出庫(kù)數(shù)量和本次初始庫(kù)存更新總庫(kù)存量。本申請(qǐng)?zhí)峁┑囊环N扣減庫(kù)存數(shù)據(jù)的裝置,應(yīng)用在前臺(tái)實(shí)例上,包括:內(nèi)存導(dǎo)入單元,用于從后臺(tái)實(shí)例導(dǎo)入總庫(kù)存量的至少部分值到內(nèi)存,將導(dǎo)入后本實(shí)例的本次初始庫(kù)存返回給后臺(tái)實(shí)例;出庫(kù)通知單元,用于將每筆出庫(kù)的出庫(kù)數(shù)量通知后臺(tái)實(shí)例;心跳通知單元,用于向后臺(tái)實(shí)例發(fā)送心跳通知,供后臺(tái)實(shí)例檢測(cè)本實(shí)例是否發(fā)生故障,并在發(fā)生故障時(shí)根據(jù)本次初始庫(kù)存和出庫(kù)數(shù)量更新總庫(kù)存量。由以上技術(shù)方案可見,本申請(qǐng)的實(shí)施例中,通過(guò)記錄導(dǎo)入前臺(tái)實(shí)例內(nèi)存的本次初始庫(kù)存和每筆出庫(kù)數(shù)量以及發(fā)生時(shí)間,在前臺(tái)實(shí)例發(fā)生故障時(shí),根據(jù)發(fā)生時(shí)間和出庫(kù)數(shù)量計(jì)算前臺(tái)實(shí)例在故障時(shí)內(nèi)存中的分庫(kù)存量,并將其更新到庫(kù)存總數(shù)據(jù)中,從而既能夠在內(nèi)存中扣減庫(kù)存以高效響應(yīng)高并發(fā)的業(yè)務(wù)訪問(wèn),又能避免在發(fā)生故障時(shí)庫(kù)存數(shù)據(jù)和交易數(shù)據(jù)的不一致,在實(shí)現(xiàn)高性能的同時(shí)提高了數(shù)據(jù)的準(zhǔn)確性。附圖說(shuō)明圖1是本申請(qǐng)實(shí)施例中一種應(yīng)用在后臺(tái)實(shí)例上扣減庫(kù)存數(shù)據(jù)的方法的流程圖;圖2是本申請(qǐng)實(shí)施例中一種應(yīng)用在前臺(tái)實(shí)例上扣減庫(kù)存數(shù)據(jù)的方法的流程圖;圖3是本申請(qǐng)應(yīng)用示例中之間的交互流程圖;圖4是應(yīng)用本申請(qǐng)實(shí)施例的計(jì)算設(shè)備的一種硬件結(jié)構(gòu)圖;圖5是本申請(qǐng)實(shí)施例中一種應(yīng)用在后臺(tái)實(shí)例上扣減庫(kù)存數(shù)據(jù)的裝置的邏輯結(jié)構(gòu)圖;圖6是本申請(qǐng)實(shí)施例中一種應(yīng)用在前臺(tái)實(shí)例上扣減庫(kù)存數(shù)據(jù)的裝置的邏輯結(jié)構(gòu)圖。具體實(shí)施方式本申請(qǐng)的實(shí)施例提供了一種新的扣減庫(kù)存數(shù)據(jù)的方法,通過(guò)記錄導(dǎo)入前臺(tái)實(shí)例內(nèi)存的本次初始庫(kù)存、導(dǎo)入時(shí)刻、前臺(tái)實(shí)例的出庫(kù)數(shù)量和出庫(kù)時(shí)刻,在故障導(dǎo)致內(nèi)存數(shù)據(jù)丟失時(shí),能夠根據(jù)所記錄的信息還原故障時(shí)內(nèi)存中的庫(kù)存量,避免庫(kù)存數(shù)據(jù)與交易數(shù)據(jù)不一致,以解決現(xiàn)有技術(shù)中存在的問(wèn)題。本申請(qǐng)的實(shí)施例中,前臺(tái)實(shí)例負(fù)責(zé)接收和響應(yīng)來(lái)自用戶或交易系統(tǒng)的扣 減庫(kù)存的請(qǐng)求,后臺(tái)實(shí)例負(fù)責(zé)維護(hù)總庫(kù)存量并向前臺(tái)實(shí)例提供可供扣減的分庫(kù)存。前臺(tái)實(shí)例和后臺(tái)實(shí)例可以是運(yùn)行在同一臺(tái)物理或邏輯服務(wù)器上的不同進(jìn)程,其中后臺(tái)實(shí)例可以服務(wù)于一個(gè)到多個(gè)前臺(tái)實(shí)例,每個(gè)前臺(tái)實(shí)例具有獨(dú)立的內(nèi)存空間用來(lái)進(jìn)行分配給該前臺(tái)實(shí)例的分庫(kù)存的扣減。前臺(tái)實(shí)例和后臺(tái)實(shí)例也可以運(yùn)行在不同的物理或邏輯計(jì)算設(shè)備上,這種組網(wǎng)結(jié)構(gòu)中后臺(tái)實(shí)例也可以服務(wù)于一個(gè)到多個(gè)前臺(tái)實(shí)例;此外,后臺(tái)實(shí)例可以運(yùn)行在一個(gè)到多個(gè)物理或邏輯設(shè)備上,這些設(shè)備協(xié)同工作共同完成后臺(tái)實(shí)例的各項(xiàng)功能。本申請(qǐng)的實(shí)施例中,扣減庫(kù)存數(shù)據(jù)的方法應(yīng)用在后臺(tái)實(shí)例上的流程如圖1所示,應(yīng)用在前臺(tái)實(shí)例上的流程如圖2所示。在前臺(tái)實(shí)例上,步驟210,從后臺(tái)實(shí)例導(dǎo)入總庫(kù)存量的至少部分值到內(nèi)存,將導(dǎo)入后本實(shí)例的本次初始庫(kù)存返回給后臺(tái)實(shí)例。在后臺(tái)實(shí)例上,步驟110,導(dǎo)入總庫(kù)存量的至少部分值到前臺(tái)實(shí)例,保存前臺(tái)實(shí)例的導(dǎo)入記錄,包括導(dǎo)入后前臺(tái)實(shí)例的本次初始庫(kù)存和導(dǎo)入時(shí)序標(biāo)簽。在前臺(tái)實(shí)例啟動(dòng)運(yùn)行時(shí),可以由后臺(tái)實(shí)例主動(dòng)將總庫(kù)存量的至少部分值導(dǎo)入到前臺(tái)實(shí)例的內(nèi)存中;也可以由前臺(tái)實(shí)例先向后臺(tái)實(shí)例請(qǐng)求分庫(kù)存導(dǎo)入,后臺(tái)實(shí)例響應(yīng)該請(qǐng)求,將總庫(kù)存量的至少部分值導(dǎo)入到前臺(tái)實(shí)例的內(nèi)存中。在前臺(tái)實(shí)例的運(yùn)行過(guò)程中,可以在內(nèi)存中的分庫(kù)存量扣減到零、或內(nèi)存中的分庫(kù)存量小于請(qǐng)求出庫(kù)的出庫(kù)數(shù)量時(shí),向后臺(tái)實(shí)例請(qǐng)求分庫(kù)存導(dǎo)入??梢愿鶕?jù)前臺(tái)實(shí)例的數(shù)量、并發(fā)扣減請(qǐng)求的數(shù)量等因素來(lái)確定后臺(tái)實(shí)例向前臺(tái)實(shí)例每次導(dǎo)入分庫(kù)存的具體數(shù)值。該數(shù)值可以由管理員預(yù)先設(shè)定,也可以由后臺(tái)實(shí)例或前臺(tái)實(shí)例根據(jù)一定的算法確定,本實(shí)施例中不做限定。在總庫(kù)存量的剩余值很小時(shí),后臺(tái)實(shí)例可能將全部的總庫(kù)存量導(dǎo)入到某個(gè)前臺(tái)實(shí)例的內(nèi)存中。后臺(tái)實(shí)例在將某個(gè)數(shù)量的庫(kù)存導(dǎo)入到前臺(tái)實(shí)例時(shí),將總庫(kù)存量更新為原總庫(kù)存量中減去導(dǎo)入的數(shù)量。前臺(tái)實(shí)例完成分庫(kù)存導(dǎo)入后,其內(nèi)存中的分庫(kù)存量更新為原來(lái)內(nèi)存中的分庫(kù)存量加上導(dǎo)入的數(shù)量,即本次初始庫(kù)存。前臺(tái) 實(shí)例將本次導(dǎo)入的本次初始庫(kù)存通知后臺(tái)實(shí)例。后臺(tái)實(shí)例保存本次導(dǎo)入的記錄,包括前臺(tái)實(shí)例的本次初始庫(kù)存和導(dǎo)入時(shí)序標(biāo)簽。在一種實(shí)現(xiàn)方式中,將導(dǎo)入時(shí)刻作為導(dǎo)入時(shí)序標(biāo)簽。導(dǎo)入時(shí)刻可以由后臺(tái)實(shí)例在收到前臺(tái)實(shí)例的本次初始庫(kù)存時(shí),根據(jù)系統(tǒng)時(shí)間自行添加在導(dǎo)入記錄中;也可以由前臺(tái)實(shí)例在導(dǎo)入后更新分庫(kù)存量時(shí)采集系統(tǒng)時(shí)間作為導(dǎo)入時(shí)刻,并將導(dǎo)入時(shí)刻與本次初始庫(kù)存一并通知給后臺(tái)實(shí)例。在另一種實(shí)現(xiàn)方式中,后臺(tái)實(shí)例可以為每次前臺(tái)實(shí)例的庫(kù)存導(dǎo)入生成對(duì)應(yīng)的批次號(hào),并將批次號(hào)作為導(dǎo)入時(shí)序標(biāo)簽。前臺(tái)實(shí)例在從后臺(tái)實(shí)例導(dǎo)入分庫(kù)存時(shí),獲取本次導(dǎo)入的批次號(hào),該批次號(hào)對(duì)應(yīng)于本次導(dǎo)入的本次初始庫(kù)存;后臺(tái)實(shí)例在保存前臺(tái)實(shí)例的導(dǎo)入記錄時(shí),一并保存本次初始庫(kù)存和對(duì)應(yīng)的批次號(hào)。在前臺(tái)實(shí)例上,步驟220,將每筆出庫(kù)的出庫(kù)數(shù)量通知后臺(tái)實(shí)例。在后臺(tái)實(shí)例上,步驟120,保存前臺(tái)實(shí)例的出庫(kù)記錄,包括出庫(kù)數(shù)量和出庫(kù)時(shí)序標(biāo)簽。前臺(tái)實(shí)例收到來(lái)自用戶或交易系統(tǒng)的扣減庫(kù)存請(qǐng)求后,如果內(nèi)存中的分庫(kù)存量不小于請(qǐng)求出庫(kù)的數(shù)量,則將分庫(kù)存量減去請(qǐng)求出庫(kù)的數(shù)量,并返回成功扣減的響應(yīng),完成出庫(kù)。前臺(tái)實(shí)例將每次完成出庫(kù)的出庫(kù)數(shù)量通知后臺(tái)實(shí)例。后臺(tái)實(shí)例保存出庫(kù)記錄,其中包括前臺(tái)實(shí)例每筆出庫(kù)的出庫(kù)數(shù)量和出庫(kù)時(shí)序標(biāo)簽。在將導(dǎo)入時(shí)刻作為導(dǎo)入時(shí)序標(biāo)簽的實(shí)現(xiàn)中,可以將出庫(kù)時(shí)刻作為出庫(kù)時(shí)序標(biāo)簽。與導(dǎo)入時(shí)刻類似,后臺(tái)實(shí)例可以在收到前臺(tái)實(shí)例某筆出庫(kù)的出庫(kù)數(shù)量時(shí),采集系統(tǒng)時(shí)間作為該筆出庫(kù)的出庫(kù)時(shí)刻。也可以由前臺(tái)實(shí)例在完成出庫(kù)時(shí)采集系統(tǒng)時(shí)間作為出庫(kù)時(shí)刻,并將出庫(kù)時(shí)刻與出庫(kù)數(shù)量一并通知給后臺(tái)實(shí)例。在將批次號(hào)作為導(dǎo)入時(shí)序標(biāo)簽的實(shí)現(xiàn)中,可以將出庫(kù)扣減的本次初始庫(kù)存所對(duì)應(yīng)的批次號(hào)作為出庫(kù)時(shí)序標(biāo)簽。本次出庫(kù)時(shí)所扣減的分庫(kù)存量是哪個(gè) 本次初始庫(kù)存的剩余量,這個(gè)本次初始庫(kù)存即是出庫(kù)數(shù)量所扣減的本次初始庫(kù)存。前臺(tái)實(shí)例在每筆出庫(kù)后,將出庫(kù)數(shù)量通知后臺(tái)實(shí)例時(shí),也一并將本筆出庫(kù)所扣減的本次初始庫(kù)存所對(duì)應(yīng)的批次號(hào)通知后臺(tái)實(shí)例;后臺(tái)實(shí)例在前臺(tái)實(shí)例的出庫(kù)記錄中保存每筆出庫(kù)的出庫(kù)數(shù)量和批次號(hào)。在前臺(tái)實(shí)例上,步驟230,向后臺(tái)實(shí)例發(fā)送心跳通知,供后臺(tái)實(shí)例檢測(cè)本實(shí)例是否發(fā)生故障,并在發(fā)生故障時(shí)根據(jù)本次初始庫(kù)存和出庫(kù)數(shù)量更新總庫(kù)存量。在后臺(tái)實(shí)例上,步驟130,當(dāng)前臺(tái)實(shí)例發(fā)生故障時(shí),根據(jù)導(dǎo)入時(shí)序標(biāo)簽和出庫(kù)時(shí)序標(biāo)簽確定扣減本次初始庫(kù)存的出庫(kù)數(shù)量,按照所確定的出庫(kù)數(shù)量和本次初始庫(kù)存更新總庫(kù)存量。本實(shí)施例中,在前臺(tái)實(shí)例與后臺(tái)實(shí)例的交互中,任何可以讓后臺(tái)實(shí)例感知到前臺(tái)實(shí)例在正常運(yùn)行的來(lái)自前臺(tái)實(shí)例的數(shù)據(jù)、請(qǐng)求或其他信息都可以作為心跳通知。例如,前臺(tái)實(shí)例在導(dǎo)入庫(kù)存后向后臺(tái)實(shí)例返回其本次初始庫(kù)存可以看做前臺(tái)實(shí)例的心跳通知,前臺(tái)實(shí)例在出庫(kù)后向后臺(tái)實(shí)例發(fā)送出庫(kù)數(shù)量也可以看做前臺(tái)實(shí)例的心跳通知。前臺(tái)實(shí)例也可以在滿足一定條件時(shí)主動(dòng)向后臺(tái)實(shí)例發(fā)送心跳通知,以告知后臺(tái)實(shí)例自身工作狀態(tài)正常,例如,前臺(tái)實(shí)例可以在每出庫(kù)N筆時(shí)向后臺(tái)實(shí)例發(fā)送心跳通知;和/或,在與上一次的心跳通知(可以包括返回本次初始庫(kù)存、發(fā)送出庫(kù)數(shù)量)的發(fā)送時(shí)間間隔達(dá)到預(yù)設(shè)通知閾值時(shí),向后臺(tái)實(shí)例發(fā)送心跳通知。根據(jù)實(shí)際應(yīng)用場(chǎng)景和心跳通知方式的不同,后臺(tái)實(shí)例可以采用不同的判斷標(biāo)準(zhǔn)來(lái)確定前臺(tái)實(shí)例是否發(fā)生故障。此外,現(xiàn)有技術(shù)中各種檢測(cè)某個(gè)設(shè)備、某個(gè)設(shè)備上運(yùn)行的進(jìn)程的狀態(tài)是否正常的方式都可以在本申請(qǐng)的實(shí)施例中用來(lái)檢測(cè)前臺(tái)實(shí)例是否發(fā)生故障,不再贅述。在一種實(shí)現(xiàn)方式中,在后臺(tái)實(shí)例上為每個(gè)前臺(tái)實(shí)例維護(hù)一個(gè)刷新時(shí)刻,根據(jù)前臺(tái)實(shí)例心跳通知的發(fā)生時(shí)間來(lái)更新該刷新時(shí)刻。例如,可以由后臺(tái)實(shí)例在每次收到前臺(tái)實(shí)例的心跳通知時(shí),將刷新時(shí)刻改寫為接收時(shí)刻;也可以由前臺(tái)實(shí)例利用心跳通知,來(lái)將保存在后臺(tái)實(shí)例上的刷新時(shí)刻改寫為心跳通 知的發(fā)送時(shí)刻。這種實(shí)現(xiàn)方式中,后臺(tái)實(shí)例如果檢測(cè)到前臺(tái)實(shí)例的刷新時(shí)刻距當(dāng)前時(shí)刻超過(guò)預(yù)設(shè)故障故障閾值時(shí),認(rèn)為前臺(tái)實(shí)例發(fā)生故障。后臺(tái)實(shí)例可以為每個(gè)前臺(tái)實(shí)例的刷新時(shí)刻設(shè)置定時(shí)為預(yù)設(shè)故障閾值的定時(shí)器,在改寫刷新時(shí)刻時(shí)重置定時(shí)器;當(dāng)定時(shí)器時(shí)間到時(shí),后臺(tái)實(shí)例得知前臺(tái)實(shí)例發(fā)生故障。后臺(tái)實(shí)例也可以周期性掃描所有前臺(tái)實(shí)例的刷新時(shí)刻,來(lái)檢測(cè)是否有距當(dāng)前時(shí)刻超過(guò)預(yù)設(shè)故障閾值的刷新時(shí)刻,如果有,則該刷新時(shí)刻所屬的前臺(tái)實(shí)例發(fā)生故障。當(dāng)前臺(tái)實(shí)例發(fā)生故障時(shí),其內(nèi)存中的分庫(kù)存量可能還沒(méi)有全部扣減完畢,這些分庫(kù)存量因前臺(tái)實(shí)例的故障無(wú)法繼續(xù)用來(lái)響應(yīng)用戶或交易系統(tǒng)的請(qǐng)求,而這些分庫(kù)存量已經(jīng)在總庫(kù)存量中去除,就造成了庫(kù)存數(shù)據(jù)與交易數(shù)據(jù)的不一致。因此,在后臺(tái)實(shí)例檢測(cè)到前臺(tái)實(shí)例發(fā)生故障時(shí),根據(jù)導(dǎo)入時(shí)序標(biāo)簽和出庫(kù)時(shí)序標(biāo)簽來(lái)確定在本次導(dǎo)入之后發(fā)生了多少筆出庫(kù)以及每筆出庫(kù)的出庫(kù)數(shù)量,即扣減本次初始庫(kù)存的出庫(kù)數(shù)量,再按照本次導(dǎo)入之后發(fā)生的出庫(kù)數(shù)量和本次初始庫(kù)存來(lái)更新總庫(kù)存量。在將導(dǎo)入時(shí)刻作為導(dǎo)入時(shí)序標(biāo)簽的實(shí)現(xiàn)中,以導(dǎo)入時(shí)刻為基準(zhǔn),查找出庫(kù)時(shí)刻在導(dǎo)入時(shí)刻之后的各筆出庫(kù)記錄中的出庫(kù)數(shù)量,即為扣減本次初始庫(kù)存的出庫(kù)數(shù)量。在將批次號(hào)作為導(dǎo)入時(shí)序標(biāo)簽的實(shí)現(xiàn)中,具有本次初始庫(kù)存所對(duì)應(yīng)的批次號(hào)的出庫(kù)記錄中的出庫(kù)數(shù)量,就是扣減本次初始庫(kù)存的出庫(kù)數(shù)量??梢姡瑢⑴翁?hào)作為導(dǎo)入時(shí)序標(biāo)簽可以不必比較導(dǎo)入時(shí)刻和每筆出庫(kù)記錄的出庫(kù)時(shí)刻,能夠提高更新總庫(kù)存量的運(yùn)行速度。在得到扣減本次初始庫(kù)存的出庫(kù)數(shù)量(可能是零筆到多筆)后,計(jì)算這些出庫(kù)數(shù)量之和,得到本次導(dǎo)入后該前臺(tái)實(shí)例的出庫(kù)總量;如果出庫(kù)總量等于本次初始庫(kù)存,則該前臺(tái)實(shí)例在故障時(shí)內(nèi)存中分庫(kù)存量為零,流程結(jié)束;如果出庫(kù)總量小于本次初始庫(kù)存,則該前臺(tái)實(shí)例在故障時(shí)內(nèi)存中尚有分庫(kù)存量,把出庫(kù)總量與本次初始庫(kù)存的差值加回到總庫(kù)存量中,即可達(dá)到庫(kù)存數(shù)據(jù)與交易數(shù)據(jù)的一致性。從上述過(guò)程可以看出,在前臺(tái)實(shí)例發(fā)生故障后,只需要最后一次導(dǎo)入分 庫(kù)存的記錄和最后一次導(dǎo)入分庫(kù)存后的出庫(kù)記錄即可得到故障發(fā)生時(shí)前臺(tái)實(shí)例內(nèi)存中剩余的庫(kù)存量。因此,后臺(tái)實(shí)例可以在保存前臺(tái)實(shí)例的本次導(dǎo)入記錄后,將該前臺(tái)實(shí)例的上次導(dǎo)入記錄置為無(wú)效;在檢測(cè)到前臺(tái)實(shí)例發(fā)生故障后,采用當(dāng)前有效的導(dǎo)入記錄(即最后一次導(dǎo)入的記錄)中的導(dǎo)入時(shí)刻和本次初始庫(kù)存來(lái)更新總庫(kù)存量??梢?,本申請(qǐng)的實(shí)施例中通過(guò)記錄每次導(dǎo)入分庫(kù)存后前臺(tái)實(shí)例的本次初始庫(kù)存和導(dǎo)入時(shí)序標(biāo)簽,以及每筆出庫(kù)的出庫(kù)數(shù)量以及出庫(kù)時(shí)序標(biāo)簽,在前臺(tái)實(shí)例發(fā)生故障導(dǎo)致內(nèi)存數(shù)據(jù)丟失時(shí),根據(jù)所記錄的時(shí)序和數(shù)量即可還原故障時(shí)內(nèi)存中的分庫(kù)存量,并將其更新到庫(kù)存總數(shù)據(jù)中,既實(shí)現(xiàn)了在內(nèi)存中扣減庫(kù)存以滿足高并發(fā)的性能要求,又能夠在發(fā)生故障時(shí)達(dá)到庫(kù)存數(shù)據(jù)和交易數(shù)據(jù)的一致性。在本申請(qǐng)的一個(gè)應(yīng)用示例中,前臺(tái)實(shí)例為數(shù)臺(tái)庫(kù)存服務(wù)器,后臺(tái)實(shí)例包括數(shù)據(jù)庫(kù)服務(wù)器和任務(wù)調(diào)度服務(wù)器。庫(kù)存服務(wù)器接收并響應(yīng)用戶的扣減庫(kù)存請(qǐng)求,庫(kù)存服務(wù)器、數(shù)據(jù)庫(kù)服務(wù)器和任務(wù)調(diào)度服務(wù)器之間的交互流程如圖3所示。當(dāng)庫(kù)存服務(wù)器收到用戶的扣減庫(kù)存請(qǐng)求時(shí),發(fā)現(xiàn)內(nèi)存中的分庫(kù)存量已經(jīng)扣減到零,向數(shù)據(jù)庫(kù)服務(wù)器請(qǐng)求導(dǎo)入分庫(kù)存。數(shù)據(jù)庫(kù)服務(wù)器將總庫(kù)存量中的一部分導(dǎo)入到庫(kù)存服務(wù)器的內(nèi)存中,從總庫(kù)存量中減去所導(dǎo)入的部分。數(shù)據(jù)庫(kù)服務(wù)器生成本次導(dǎo)入的批次號(hào),并將批次號(hào)告知庫(kù)存服務(wù)器。庫(kù)存服務(wù)器將本次導(dǎo)入完成時(shí)內(nèi)存中的分庫(kù)存量,即本次初始庫(kù)存通知數(shù)據(jù)庫(kù)服務(wù)器。數(shù)據(jù)庫(kù)服務(wù)器在內(nèi)存記錄表(Memory_Record)中增加一行記錄,保存本次導(dǎo)入的發(fā)生時(shí)間、庫(kù)存服務(wù)器的刷新時(shí)刻、本次導(dǎo)入的批次號(hào)、本次初始庫(kù)存。一種內(nèi)存記錄表的結(jié)構(gòu)示例如表1所示:IDGmt_createGmt_modifiedStorageBatch_idStatus116:37:5416:37:58100234disable216:37:5916:37:59100235active表1表1中,ID為行標(biāo)識(shí);Gmt_create為導(dǎo)入的發(fā)生時(shí)間;Gmt_modified為庫(kù)存服務(wù)器的刷新時(shí)刻,本應(yīng)用實(shí)例中心跳通知包括庫(kù)存服務(wù)器上傳本次初始庫(kù)存,第2行記錄中刷新時(shí)刻與本次導(dǎo)入的發(fā)生時(shí)間相同;Storage為導(dǎo)入后的本次初始庫(kù)存;Batch_id為導(dǎo)入的批次號(hào);Status為表1中導(dǎo)入記錄的狀態(tài),當(dāng)本次導(dǎo)入完成時(shí),同一個(gè)庫(kù)存服務(wù)器的上次導(dǎo)入記錄被置為無(wú)效(disable)。庫(kù)存服務(wù)器響應(yīng)用戶的扣減庫(kù)存請(qǐng)求,從內(nèi)存中的分庫(kù)存量中減去用戶請(qǐng)求扣減的數(shù)量2,將扣減成功的消息作為響應(yīng)通知用戶。庫(kù)存服務(wù)器向數(shù)據(jù)庫(kù)服務(wù)器發(fā)送出庫(kù)通知,其中包括本筆出庫(kù)的出庫(kù)數(shù)量、所扣減本次初始庫(kù)存的批次號(hào)。數(shù)據(jù)服務(wù)器在出庫(kù)記錄表(Outstorage_Record)中增加一行記錄,保存本筆出庫(kù)的出庫(kù)時(shí)刻、出庫(kù)數(shù)量和所扣減本次初始庫(kù)存的批次號(hào)。一種出庫(kù)記錄表的結(jié)構(gòu)可以如表2所示:IdGmt_createReq_numBatch_id116:38:002235表2表2中,ID為行標(biāo)識(shí);Gmt_create為本筆出庫(kù)的出庫(kù)時(shí)刻;Req_num為本筆出庫(kù)的出庫(kù)數(shù)量;Batch_id為本筆出庫(kù)所扣減本次初始庫(kù)存的批次號(hào)。庫(kù)存服務(wù)器每出庫(kù)5筆,向服務(wù)器發(fā)送一次心跳通知,該心跳通知用來(lái)更新內(nèi)存記錄表中的庫(kù)存服務(wù)器本次初始庫(kù)存對(duì)應(yīng)的批次號(hào)所在行中的Gmt_modified,將Gmt_modified更新為當(dāng)前時(shí)刻。同時(shí),庫(kù)存服務(wù)器維護(hù)一個(gè)心跳定時(shí)器,每次發(fā)送心跳通知時(shí)重置心跳定時(shí)器;如果心跳定時(shí)器定時(shí)時(shí),則向數(shù)據(jù)庫(kù)服務(wù)器發(fā)送心跳通知。這樣,可以確保向數(shù)據(jù)庫(kù)服務(wù)器發(fā)送心跳通知的時(shí)間間隔不會(huì)超過(guò)心跳定時(shí)器的定時(shí)。任務(wù)調(diào)度服務(wù)器定時(shí)掃描內(nèi)存記錄表中狀態(tài)為有效(active)的記錄中的Gmt_modified字段,如果該字段的時(shí)刻在當(dāng)前時(shí)刻減去預(yù)設(shè)故障閾值的時(shí)刻 之前,則判定該記錄異常,所對(duì)應(yīng)的庫(kù)存服務(wù)器發(fā)生故障。任務(wù)調(diào)度服務(wù)器提取內(nèi)存記錄表中該記錄的批次號(hào)和本次初始庫(kù)存,在出庫(kù)記錄表查找出所有具有該批次號(hào)的記錄,將這些記錄中的出庫(kù)數(shù)量加總,和本次初始庫(kù)存做比較,判斷本批次分庫(kù)存是否完全出庫(kù);如果出庫(kù)數(shù)量之和小于本次初始庫(kù)存,則這批次的分庫(kù)存并未完全出庫(kù),將差值加回到庫(kù)存服務(wù)器的總庫(kù)存量中。與上述流程實(shí)現(xiàn)對(duì)應(yīng),本申請(qǐng)的實(shí)施例還提供了一種應(yīng)用在后臺(tái)實(shí)例上的扣減庫(kù)存數(shù)據(jù)的裝置,和一種應(yīng)用在前臺(tái)實(shí)例上的扣減庫(kù)存數(shù)據(jù)的裝置。這兩種裝置均可以通過(guò)軟件實(shí)現(xiàn),也可以通過(guò)硬件或者軟硬件結(jié)合的方式實(shí)現(xiàn)。以軟件實(shí)現(xiàn)為例,作為邏輯意義上的裝置,是通過(guò)裝置所在計(jì)算設(shè)備的CPU(CentralProcessUnit,中央處理器)將對(duì)應(yīng)的計(jì)算機(jī)程序指令讀取到內(nèi)存中運(yùn)行形成的。從硬件層面而言,除了圖4所示的CPU、內(nèi)存以及非易失性存儲(chǔ)器之外,扣減庫(kù)存數(shù)據(jù)的裝置所在的計(jì)算設(shè)備通常還包括用于實(shí)現(xiàn)網(wǎng)絡(luò)通信功能的板卡等其他硬件。圖5所示為本申請(qǐng)實(shí)施例提供的一種扣減庫(kù)存數(shù)據(jù)的裝置,應(yīng)用在保存有總庫(kù)存量的后臺(tái)實(shí)例上,其特征在于,包括分庫(kù)存導(dǎo)入及記錄單元、出庫(kù)記錄保存單元和總庫(kù)存更新單元,其中:分庫(kù)存導(dǎo)入及記錄單元用于導(dǎo)入總庫(kù)存量的至少部分值到前臺(tái)實(shí)例的內(nèi)存,保存前臺(tái)實(shí)例的導(dǎo)入記錄,包括導(dǎo)入后前臺(tái)實(shí)例的本次初始庫(kù)存和導(dǎo)入時(shí)序標(biāo)簽;出庫(kù)記錄保存單元用于保存前臺(tái)實(shí)例的出庫(kù)記錄,包括出庫(kù)數(shù)量和出庫(kù)時(shí)序標(biāo)簽;總庫(kù)存更新單元用于當(dāng)前臺(tái)實(shí)例發(fā)生故障時(shí),根據(jù)導(dǎo)入時(shí)序標(biāo)簽和出庫(kù)時(shí)序標(biāo)簽確定扣減本次初始庫(kù)存的出庫(kù)數(shù)量,按照所確定的出庫(kù)數(shù)量和本次初始庫(kù)存更新總庫(kù)存量。一種實(shí)現(xiàn)方式中,所述導(dǎo)入時(shí)序標(biāo)簽為導(dǎo)入時(shí)刻;所述出庫(kù)時(shí)序標(biāo)簽為出庫(kù)時(shí)刻;所述扣減本次初始庫(kù)存的出庫(kù)數(shù)量包括:出庫(kù)時(shí)刻在本次初始庫(kù)存的導(dǎo)入時(shí)刻之后的出庫(kù)數(shù)量。另一種實(shí)現(xiàn)方式中,所述導(dǎo)入時(shí)序標(biāo)簽包括:本次導(dǎo)入的批次號(hào);所述出庫(kù)時(shí)序標(biāo)簽包括:出庫(kù)扣減的本次初始庫(kù)存所對(duì)應(yīng)的批次號(hào);所述扣減本 次初始庫(kù)存的出庫(kù)數(shù)量包括:具有本次初始庫(kù)存對(duì)應(yīng)的批次號(hào)的出庫(kù)數(shù)量??蛇x的,所述裝置還包括心跳更新單元,用于根據(jù)前臺(tái)實(shí)例心跳通知的發(fā)生時(shí)間更新前臺(tái)實(shí)例的刷新時(shí)刻;所述前臺(tái)實(shí)例發(fā)生故障包括:前臺(tái)實(shí)例的刷新時(shí)刻距當(dāng)前時(shí)刻超過(guò)預(yù)設(shè)故障閾值??蛇x的,所述心跳通知包括:前臺(tái)實(shí)例導(dǎo)入庫(kù)存后返回其本次初始庫(kù)存,和/或前臺(tái)實(shí)例發(fā)送出庫(kù)數(shù)量??蛇x的,所述總庫(kù)存更新單元按照所確定的出庫(kù)數(shù)量和本次初始庫(kù)存更新總庫(kù)存量,包括:計(jì)算所確定的出庫(kù)數(shù)量之和,如果所述出庫(kù)數(shù)量之和小于本次初始庫(kù)存,則將出庫(kù)數(shù)量之和與本次初始庫(kù)存的差值加入當(dāng)前總庫(kù)存量。圖6所示為本申請(qǐng)實(shí)施例提供的一種扣減庫(kù)存數(shù)據(jù)的裝置,應(yīng)用在前臺(tái)實(shí)例上,其特征在于,包括內(nèi)存導(dǎo)入單元、出庫(kù)通知單元和心跳通知單元,其中:內(nèi)存導(dǎo)入單元用于從后臺(tái)實(shí)例導(dǎo)入總庫(kù)存量的至少部分值到內(nèi)存,將導(dǎo)入后本實(shí)例的本次初始庫(kù)存返回給后臺(tái)實(shí)例;出庫(kù)通知單元用于將每筆出庫(kù)的出庫(kù)數(shù)量通知后臺(tái)實(shí)例;心跳通知單元用于向后臺(tái)實(shí)例發(fā)送心跳通知,供后臺(tái)實(shí)例檢測(cè)本實(shí)例是否發(fā)生故障,并在發(fā)生故障時(shí)根據(jù)本次初始庫(kù)存和出庫(kù)數(shù)量更新總庫(kù)存量??蛇x的,所述心跳通知單元具體用于:每出庫(kù)N筆,向后臺(tái)實(shí)例發(fā)送心跳通知;和/或,與上一次心跳通知的發(fā)送時(shí)間間隔達(dá)到預(yù)設(shè)通知閾值時(shí),向后臺(tái)實(shí)例發(fā)送心跳通知??蛇x的,所述內(nèi)存導(dǎo)入單元從后臺(tái)實(shí)例導(dǎo)入總庫(kù)存量的至少部分值,包括:當(dāng)本實(shí)例的分庫(kù)存量扣減到零、或本實(shí)例的分庫(kù)存量小于請(qǐng)求出庫(kù)的出庫(kù)數(shù)量時(shí),從后臺(tái)實(shí)例導(dǎo)入總庫(kù)存量的至少部分值??蛇x的,所述內(nèi)存導(dǎo)入單元從后臺(tái)實(shí)例導(dǎo)入總庫(kù)存量的至少部分值,包括:從后臺(tái)實(shí)例導(dǎo)入總庫(kù)存量的至少部分值,獲取導(dǎo)入后本次初始庫(kù)存對(duì)應(yīng)的批次號(hào);所述出庫(kù)通知單元具體用于:將每筆出庫(kù)的出庫(kù)數(shù)量和所扣減的本次初始庫(kù)存所對(duì)應(yīng)的批次號(hào)通知后臺(tái)實(shí)例。以上所述僅為本申請(qǐng)的較佳實(shí)施例而已,并不用以限制本申請(qǐng),凡在本申請(qǐng)的精神和原則之內(nèi),所做的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本申請(qǐng)保護(hù)的范圍之內(nèi)。在一個(gè)典型的配置中,計(jì)算設(shè)備包括一個(gè)或多個(gè)處理器(CPU)、輸入/輸出接口、網(wǎng)絡(luò)接口和內(nèi)存。內(nèi)存可能包括計(jì)算機(jī)可讀介質(zhì)中的非永久性存儲(chǔ)器,隨機(jī)存取存儲(chǔ)器(RAM)和/或非易失性內(nèi)存等形式,如只讀存儲(chǔ)器(ROM)或閃存(flashRAM)。內(nèi)存是計(jì)算機(jī)可讀介質(zhì)的示例。計(jì)算機(jī)可讀介質(zhì)包括永久性和非永久性、可移動(dòng)和非可移動(dòng)媒體可以由任何方法或技術(shù)來(lái)實(shí)現(xiàn)信息存儲(chǔ)。信息可以是計(jì)算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序的模塊或其他數(shù)據(jù)。計(jì)算機(jī)的存儲(chǔ)介質(zhì)的例子包括,但不限于相變內(nèi)存(PRAM)、靜態(tài)隨機(jī)存取存儲(chǔ)器(SRAM)、動(dòng)態(tài)隨機(jī)存取存儲(chǔ)器(DRAM)、其他類型的隨機(jī)存取存儲(chǔ)器(RAM)、只讀存儲(chǔ)器(ROM)、電可擦除可編程只讀存儲(chǔ)器(EEPROM)、快閃記憶體或其他內(nèi)存技術(shù)、只讀光盤只讀存儲(chǔ)器(CD-ROM)、數(shù)字多功能光盤(DVD)或其他光學(xué)存儲(chǔ)、磁盒式磁帶,磁帶磁磁盤存儲(chǔ)或其他磁性存儲(chǔ)設(shè)備或任何其他非傳輸介質(zhì),可用于存儲(chǔ)可以被計(jì)算設(shè)備訪問(wèn)的信息。按照本文中的界定,計(jì)算機(jī)可讀介質(zhì)不包括暫存電腦可讀媒體(transitorymedia),如調(diào)制的數(shù)據(jù)信號(hào)和載波。還需要說(shuō)明的是,術(shù)語(yǔ)“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過(guò)程、方法、商品或者設(shè)備不僅包括那些要素,而且還包括沒(méi)有明確列出的其他要素,或者是還包括為這種過(guò)程、方法、商品或者設(shè)備所固有的要素。在沒(méi)有更多限制的情況下,由語(yǔ)句“包括一個(gè)……”限定的要素,并不排除在包括所述要素的過(guò)程、方法、商品或者設(shè)備中還存在另外的相同要素。本領(lǐng)域技術(shù)人員應(yīng)明白,本申請(qǐng)的實(shí)施例可提供為方法、系統(tǒng)或計(jì)算機(jī)程序產(chǎn)品。因此,本申請(qǐng)可采用完全硬件實(shí)施例、完全軟件實(shí)施例或結(jié)合軟件和硬件方面的實(shí)施例的形式。而且,本申請(qǐng)可采用在一個(gè)或多個(gè)其中包含有計(jì)算 機(jī)可用程序代碼的計(jì)算機(jī)可用存儲(chǔ)介質(zhì)(包括但不限于磁盤存儲(chǔ)器、CD-ROM、光學(xué)存儲(chǔ)器等)上實(shí)施的計(jì)算機(jī)程序產(chǎn)品的形式。當(dāng)前第1頁(yè)1 2 3