本申請涉及計算機應(yīng)用技術(shù)領(lǐng)域,尤其涉及一種業(yè)務(wù)處理方法、裝置及系統(tǒng)。
背景技術(shù):
在計算機系統(tǒng)中,冪等操作的特點是其任意多次執(zhí)行所產(chǎn)生的影響均與一次執(zhí)行的所產(chǎn)生的影響相同,在實際應(yīng)用中,冪等操作常用于避免重復(fù)操作對系統(tǒng)的造成的影響。以金融系統(tǒng)為例,針對一次賬務(wù)轉(zhuǎn)入或轉(zhuǎn)出請求,必須保證該請求只導(dǎo)致一次實際的轉(zhuǎn)賬處理,不允許由于網(wǎng)絡(luò)延遲等原因?qū)е露啻无D(zhuǎn)賬處理,因此金融系統(tǒng)都需要保證其對外賬務(wù)接口的冪等性,。
為了實現(xiàn)冪等性,現(xiàn)有技術(shù)的常用做法是在業(yè)務(wù)系統(tǒng)側(cè)的數(shù)據(jù)庫中針對每次業(yè)務(wù)請求建立唯一性約束,例如:在數(shù)據(jù)庫中建立冪等表,每次處理業(yè)務(wù)請求之前,均要求將該業(yè)務(wù)請求的某種唯一標(biāo)識信息(例如“業(yè)務(wù)請求單號”、“業(yè)務(wù)請求單號+業(yè)務(wù)類型”、“業(yè)務(wù)請求單號+業(yè)務(wù)請求來源”等)插入這張表,如果插入成功,說明業(yè)務(wù)系統(tǒng)是第一次處理該業(yè)務(wù)請求,則繼續(xù)正常的業(yè)務(wù)處理流程;反之如果插入失敗,則說明冪等表中已經(jīng)存在該業(yè)務(wù)的信息,即業(yè)務(wù)系統(tǒng)之前曾經(jīng)處理過該業(yè)務(wù)請求,那么可以直接確定該請求為重復(fù)請求,進(jìn)而停止處理該請求。
在一般情況下,上述方案可以較好地實現(xiàn)業(yè)務(wù)系統(tǒng)對外接口的冪等性。然而基于分布式存儲或災(zāi)備等需求,對數(shù)據(jù)進(jìn)行分表或分庫存儲的方案應(yīng)用越來越普遍,而在分表或分庫的應(yīng)用場景下,可能會出現(xiàn)的一種情況是:針對同一業(yè)務(wù),請求方向業(yè)務(wù)系統(tǒng)發(fā)起了多次請求,而出于某種原因(例如災(zāi)備切換等), 多次請求被業(yè)務(wù)系統(tǒng)路由到了不同的數(shù)據(jù)表,由于不同數(shù)據(jù)表所使用的冪等表不同,因此很可能出現(xiàn)冪等失效,進(jìn)而導(dǎo)致業(yè)務(wù)重復(fù)處理。
技術(shù)實現(xiàn)要素:
針對上述技術(shù)問題,本申請?zhí)峁┮环N業(yè)務(wù)處理方法、裝置及系統(tǒng),以解決在分庫或多庫應(yīng)用場景下的冪等失效問題,技術(shù)方案如下:
根據(jù)本申請的第一方面,提供一種業(yè)務(wù)處理方法,該方法包括:
業(yè)務(wù)請求側(cè)生成攜帶業(yè)務(wù)處理參考信息的業(yè)務(wù)處理請求,將所述業(yè)務(wù)處理請求發(fā)送至業(yè)務(wù)處理側(cè);所述業(yè)務(wù)處理參考信息用于業(yè)務(wù)處理側(cè)確定當(dāng)前業(yè)務(wù)的相關(guān)數(shù)據(jù)在數(shù)據(jù)庫中的存儲位置,針對同一業(yè)務(wù)事件多次發(fā)送的業(yè)務(wù)處理請求中攜帶相同的業(yè)務(wù)處理參考信息;
業(yè)務(wù)處理側(cè)接收到所述業(yè)務(wù)處理請求后,根據(jù)請求中攜帶的業(yè)務(wù)處理參考信息確定對應(yīng)的存儲位置,針對所確定的存儲位置進(jìn)行冪等檢查,根據(jù)冪等檢查結(jié)果對當(dāng)前業(yè)務(wù)進(jìn)行處理。
根據(jù)本申請的第二方面,提供一種業(yè)務(wù)處理方法,應(yīng)用于業(yè)務(wù)請求側(cè),該方法包括:
生成攜帶業(yè)務(wù)處理參考信息的業(yè)務(wù)處理請求;
將所述業(yè)務(wù)處理請求發(fā)送至業(yè)務(wù)處理側(cè),以使得業(yè)務(wù)處理側(cè)接收到所述業(yè)務(wù)處理請求后,根據(jù)請求中攜帶的業(yè)務(wù)處理參考信息確定對應(yīng)的存儲位置,針對所確定的存儲位置進(jìn)行冪等檢查,根據(jù)冪等檢查結(jié)果對當(dāng)前業(yè)務(wù)進(jìn)行處理;
其中,所述業(yè)務(wù)處理參考信息用于業(yè)務(wù)處理側(cè)確定當(dāng)前業(yè)務(wù)的相關(guān)數(shù)據(jù)在數(shù)據(jù)庫中的存儲位置,針對同一業(yè)務(wù)事件多次發(fā)送的業(yè)務(wù)處理請求中攜帶相同的業(yè)務(wù)處理參考信息。
根據(jù)本申請的第三方面,提供一種業(yè)務(wù)處理方法,應(yīng)用于業(yè)務(wù)處理側(cè),該方法包括:
接收業(yè)務(wù)請求側(cè)發(fā)送的業(yè)務(wù)處理請求,所述業(yè)務(wù)處理請求中攜帶業(yè)務(wù)處理參考信息;
根據(jù)請求中攜帶的業(yè)務(wù)處理參考信息確定對應(yīng)的存儲位置,針對所確定的存儲位置進(jìn)行冪等檢查,根據(jù)冪等檢查結(jié)果對當(dāng)前業(yè)務(wù)進(jìn)行處理;
其中,所述業(yè)務(wù)處理參考信息用于業(yè)務(wù)處理側(cè)確定當(dāng)前業(yè)務(wù)的相關(guān)數(shù)據(jù)在數(shù)據(jù)庫中的存儲位置,業(yè)務(wù)請求側(cè)針對同一業(yè)務(wù)事件多次發(fā)送的業(yè)務(wù)處理請求中攜帶相同的業(yè)務(wù)處理參考信息。
根據(jù)本申請的第四方面,提供一種業(yè)務(wù)處理裝置,應(yīng)用于業(yè)務(wù)請求側(cè),該裝置包括:
請求生成模塊,用于生成攜帶業(yè)務(wù)處理參考信息的業(yè)務(wù)處理請求;
請求發(fā)送模塊,用于將所述業(yè)務(wù)處理請求發(fā)送至業(yè)務(wù)處理側(cè),以使得業(yè)務(wù)處理側(cè)接收到所述業(yè)務(wù)處理請求后,根據(jù)請求中攜帶的業(yè)務(wù)處理參考信息確定對應(yīng)的存儲位置,針對所確定的存儲位置進(jìn)行冪等檢查,根據(jù)冪等檢查結(jié)果對當(dāng)前業(yè)務(wù)進(jìn)行處理;
其中,所述業(yè)務(wù)處理參考信息用于業(yè)務(wù)處理側(cè)確定當(dāng)前業(yè)務(wù)的相關(guān)數(shù)據(jù)在數(shù)據(jù)庫中的存儲位置,針對同一業(yè)務(wù)事件多次發(fā)送的業(yè)務(wù)處理請求中攜帶相同的業(yè)務(wù)處理參考信息。
根據(jù)本申請的第五方面,提供一種業(yè)務(wù)處理裝置,應(yīng)用于業(yè)務(wù)處理側(cè),該裝置包括:
請求接收模塊,用于接收業(yè)務(wù)請求側(cè)發(fā)送的業(yè)務(wù)處理請求,所述業(yè)務(wù)處理請求中攜帶業(yè)務(wù)處理參考信息;
業(yè)務(wù)處理模塊,用于根據(jù)請求中攜帶的業(yè)務(wù)處理參考信息確定對應(yīng)的存儲位置,針對所確定的存儲位置進(jìn)行冪等檢查,根據(jù)冪等檢查結(jié)果對當(dāng)前業(yè)務(wù)進(jìn)行處理;
其中,所述業(yè)務(wù)處理參考信息用于業(yè)務(wù)處理側(cè)確定當(dāng)前業(yè)務(wù)的相關(guān)數(shù)據(jù)在數(shù)據(jù)庫中的存儲位置,業(yè)務(wù)請求側(cè)針對同一業(yè)務(wù)事件多次發(fā)送的業(yè)務(wù)處理請求中攜帶相同的業(yè)務(wù)處理參考信息。
根據(jù)本申請的第六方面,提供一種業(yè)務(wù)處理系統(tǒng),該系統(tǒng)包括業(yè)務(wù)請求側(cè)裝置及業(yè)務(wù)處理側(cè)裝置:
所述業(yè)務(wù)請求側(cè)裝置包括:
請求生成模塊,用于生成攜帶業(yè)務(wù)處理參考信息的業(yè)務(wù)處理請求;
請求發(fā)送模塊,用于將所述業(yè)務(wù)處理請求發(fā)送至業(yè)務(wù)處理側(cè);
其中,所述業(yè)務(wù)處理參考信息用于業(yè)務(wù)處理側(cè)確定當(dāng)前業(yè)務(wù)的相關(guān)數(shù)據(jù)在數(shù)據(jù)庫中的存儲位置,針對同一業(yè)務(wù)事件多次發(fā)送的業(yè)務(wù)處理請求中攜帶相同的業(yè)務(wù)處理參考信息;
所述業(yè)務(wù)處理側(cè)裝置包括:
請求接收模塊,用于接收業(yè)務(wù)請求側(cè)發(fā)送的業(yè)務(wù)處理請求;
業(yè)務(wù)處理模塊,用于根據(jù)請求中攜帶的業(yè)務(wù)處理參考信息確定對應(yīng)的存儲位置,針對所確定的存儲位置進(jìn)行冪等檢查,根據(jù)冪等檢查結(jié)果對當(dāng)前業(yè)務(wù)進(jìn)行處理。
本申請所提供的技術(shù)方案,在業(yè)務(wù)請求側(cè)向業(yè)務(wù)處理側(cè)發(fā)送的業(yè)務(wù)處理請求中添加了業(yè)務(wù)處理參考信息,由于針對同一業(yè)務(wù)事件多次發(fā)送的業(yè)務(wù)處理請求中所攜帶的業(yè)務(wù)處理參考信息都是相同的,因此不會出現(xiàn)針對同一業(yè)務(wù)事件的多次冪等檢查在不同存儲位置進(jìn)行的情況,從而有效地避免了業(yè)務(wù)重復(fù)處理的問題。
應(yīng)當(dāng)理解的是,以上的一般描述和后文的細(xì)節(jié)描述僅是示例性和解釋性的,并不能限制本申請。
附圖說明
為了更清楚地說明本申請實施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對實施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本申請中記載的一些實施例,對于本領(lǐng)域普通技術(shù)人員來講,還可以根據(jù)這些附圖獲得其他的附圖。
圖1是本申請的業(yè)務(wù)處理方法的流程示意圖;
圖2是本申請的數(shù)據(jù)庫部署方案示意圖;
圖3是本申請的業(yè)務(wù)請求側(cè)裝置的結(jié)構(gòu)示意圖;
圖4是本申請的業(yè)務(wù)處理側(cè)裝置的結(jié)構(gòu)示意圖;
圖5是本申請的業(yè)務(wù)處理系統(tǒng)的結(jié)構(gòu)示意圖。
具體實施方式
在海量數(shù)據(jù)的應(yīng)用場景下,為了實現(xiàn)數(shù)據(jù)的分布式存儲,一般會對采用分表的方式對數(shù)據(jù)進(jìn)行存儲,分表可以基于多種維度實現(xiàn),其中一種常用的劃分維度是基于“時間”維度進(jìn)行分表,例如按照1年12個月劃分出12個分表,分別用于存儲在不同時間發(fā)起的業(yè)務(wù)請求所對應(yīng)的業(yè)務(wù)數(shù)據(jù)。
此外,為了保證系統(tǒng)的容災(zāi)特性,對數(shù)據(jù)庫進(jìn)行冗余備份也是一種常見的處理方案,即將主庫中的數(shù)據(jù)完全復(fù)制到fo(failover,故障切換)庫中,主庫和fo庫一般被部署在不同的區(qū)域,正常狀態(tài)下,業(yè)務(wù)請求被路由到主庫(正常模式),災(zāi)備狀態(tài)下業(yè)務(wù)請求將被切換路由至fo庫(故障切換模式)。
分庫和分表都是數(shù)據(jù)庫應(yīng)用的常見方案,然而在分庫和分表的應(yīng)用場景下,可能會導(dǎo)致現(xiàn)有的冪等性實現(xiàn)方案失效,場景舉例如下:
假設(shè)用戶a希望向用戶b轉(zhuǎn)賬100元,業(yè)務(wù)處理側(cè)的轉(zhuǎn)賬平臺在11月30日23時59分接收到a通過某應(yīng)用平臺發(fā)送的轉(zhuǎn)賬請求,將該業(yè)務(wù)路由到分表11(對11月對應(yīng)分表的統(tǒng)稱),分表11的冪等表中可以成功插入該業(yè)務(wù)的標(biāo)識信息,因此正常處理該業(yè)務(wù):將100元從賬戶a轉(zhuǎn)到賬戶b。但是由于網(wǎng)絡(luò)問題,業(yè)務(wù)請求側(cè)的應(yīng)用平臺并沒有收到業(yè)務(wù)已成功處理的響應(yīng),于是判定為處理超時并重新向轉(zhuǎn)賬平臺發(fā)送第二次轉(zhuǎn)賬請求。轉(zhuǎn)賬平臺收到第二次轉(zhuǎn)賬請求的時間為12月1日00時01分,將該業(yè)務(wù)路由到分表12(對12月對應(yīng)分表的統(tǒng)稱),而分表12的冪等表中并不存在該轉(zhuǎn)賬業(yè)務(wù)的標(biāo)識信息,因此同樣可以成功插入并且正常處理業(yè)務(wù),導(dǎo)致a再一次向b轉(zhuǎn)賬100元。
假設(shè)用戶a希望向用戶b轉(zhuǎn)賬100元,業(yè)務(wù)處理側(cè)的轉(zhuǎn)賬平臺第一次接收到a通過某應(yīng)用平臺發(fā)送的轉(zhuǎn)賬請求時,系統(tǒng)處于正常運行狀態(tài),因此將該業(yè)務(wù)路由到主庫中的數(shù)據(jù)表,主庫的冪等表中可以成功插入該業(yè)務(wù)的標(biāo)識信息,因此正常處理該業(yè)務(wù):將100元從賬戶a轉(zhuǎn)到賬戶b;由于網(wǎng)絡(luò)問題,業(yè)務(wù)請 求側(cè)的應(yīng)用平臺并沒有收到業(yè)務(wù)已成功處理的響應(yīng),于是判定為處理超時并重新向轉(zhuǎn)賬平臺發(fā)送第二次轉(zhuǎn)賬請求。轉(zhuǎn)賬平臺收到第二次轉(zhuǎn)賬請求時,主庫出現(xiàn)故障,因此將該業(yè)務(wù)路由到fo庫中的數(shù)據(jù)表,而fo庫的冪等表中并不存在該轉(zhuǎn)賬業(yè)務(wù)的標(biāo)識信息,因此同樣可以成功插入并且正常處理業(yè)務(wù),導(dǎo)致a再一次向b轉(zhuǎn)賬100元。
可見,在數(shù)據(jù)分庫或多庫存儲的應(yīng)用場景下,由于不同的存儲位置(例如主庫/fo庫、分庫、分表等等)分別維護(hù)各自的冪等表,因此當(dāng)同一業(yè)務(wù)事件的多次請求被路由到不同的存儲位置時,就會導(dǎo)致冪等檢查失效的問題。
針對上述問題,本申請?zhí)峁┮环N業(yè)務(wù)處理方法,參見圖1所示,該方法可以包括以下步驟:
s101,業(yè)務(wù)請求側(cè)生成攜帶業(yè)務(wù)處理參考信息的業(yè)務(wù)處理請求;
與現(xiàn)有技術(shù)方案相比,本申請方案在業(yè)務(wù)處理請求中添加擴展參數(shù):業(yè)務(wù)處理參考信息,該信息的一個作用是在分庫或分表的應(yīng)用場景下,令業(yè)務(wù)處理側(cè)能夠根據(jù)該信息確定出處理當(dāng)前業(yè)務(wù)所使用的數(shù)據(jù)庫存儲位置,即在處理當(dāng)前業(yè)務(wù)的過程中,相關(guān)的數(shù)據(jù)處理操作需要在哪個數(shù)據(jù)庫(包括主庫/fo、分庫等)和/或哪張數(shù)據(jù)表中進(jìn)行,以便業(yè)務(wù)處理側(cè)在所確定的存儲位置中進(jìn)行后續(xù)的數(shù)據(jù)處理操作。
本申請方案并不要求業(yè)務(wù)請求了解業(yè)務(wù)處理側(cè)的實際分庫或分表邏輯,只需業(yè)務(wù)請求側(cè)所提供的業(yè)務(wù)處理參考信息能夠被業(yè)務(wù)處理側(cè)識別、并且根據(jù)該信息確定處理當(dāng)前業(yè)務(wù)應(yīng)該使用的具體數(shù)據(jù)庫或數(shù)據(jù)表即可。
例如:對于數(shù)據(jù)庫按“時間”維度進(jìn)行分表的情況,業(yè)務(wù)請求側(cè)只需在發(fā)送業(yè)務(wù)處理請求前,獲取當(dāng)前的時刻信息,并且將該時刻信息寫入業(yè)務(wù)處理請求中。進(jìn)而業(yè)務(wù)處理側(cè)可以根據(jù)該時刻信息,選擇對應(yīng)的時間維度數(shù)據(jù)分表來進(jìn)行后續(xù)處理。
對于數(shù)據(jù)庫冗余備份的應(yīng)用場景,業(yè)務(wù)請求側(cè)需要在發(fā)送業(yè)務(wù)處理請求前,感知業(yè)務(wù)處理側(cè)當(dāng)前所使用的數(shù)據(jù)庫運行模式信息,這里所說的運行模式包括正常運行模式和故障切換模式,然后將該數(shù)據(jù)庫運行模式信息寫入業(yè)務(wù)處理請 求中。進(jìn)而業(yè)務(wù)處理側(cè)可以根據(jù)該數(shù)據(jù)庫運行模式信息,選擇主庫或fo庫來進(jìn)行后續(xù)的處理。實際應(yīng)用時,業(yè)務(wù)請求側(cè)可以以訂閱的方式獲取業(yè)務(wù)請求側(cè)或中間件主動推送的數(shù)據(jù)庫運行模式信息,也可以在需要發(fā)送業(yè)務(wù)處理請求時按需獲取數(shù)據(jù)庫運行模式信息,本申請并不需要進(jìn)行限定。
需要說明的是,上述兩種“業(yè)務(wù)處理參考信息”僅用于示意性說明,不應(yīng)理解為對本申請方案的限定,例如,在業(yè)務(wù)請求側(cè)了解業(yè)務(wù)處理側(cè)的分庫分表邏輯的情況下,也可以直接將處理當(dāng)前業(yè)務(wù)所使用的數(shù)據(jù)庫或數(shù)據(jù)表的標(biāo)識添加到業(yè)務(wù)請求中。另外可以理解的是,根據(jù)實際的應(yīng)用需求,在一條業(yè)務(wù)處理請求中,允許同時攜帶多種類型的業(yè)務(wù)處理參考信息,例如同時攜帶上述的時刻信息及數(shù)據(jù)庫運行模式信息,以便同時滿足按時間維度分表及故障切換的場景應(yīng)用需求。
s102,業(yè)務(wù)請求側(cè)將業(yè)務(wù)處理請求發(fā)送至業(yè)務(wù)處理側(cè);
本申請方案中,業(yè)務(wù)處理參考信息的另一個作用是在分庫分表的應(yīng)用場景下,保證業(yè)務(wù)處理側(cè)接口的冪等性。具體而言,要求業(yè)務(wù)請求側(cè)針對同一業(yè)務(wù)事件多次發(fā)送的業(yè)務(wù)處理請求中所攜帶的業(yè)務(wù)處理參考信息應(yīng)該是相同的,這樣就能夠令業(yè)務(wù)處理側(cè)在處理基于同一業(yè)務(wù)事件的多次請求時,都針對相同的存儲位置進(jìn)行冪等檢查,從而避免冪等檢查失效的問題發(fā)生。
實際應(yīng)用時,業(yè)務(wù)請求側(cè)可以在首次發(fā)送業(yè)務(wù)處理請求時,獲取業(yè)務(wù)處理參考信息(例如當(dāng)前時刻信息、當(dāng)前數(shù)據(jù)庫運行模式信息等),將該信息寫入業(yè)務(wù)處理請求中,并且對首次寫入的業(yè)務(wù)處理參考信息以業(yè)務(wù)事件為標(biāo)識進(jìn)行存儲。后續(xù)如果需要再次發(fā)送針對同一業(yè)務(wù)事件的處理請求,則直接讀取之前存儲的業(yè)務(wù)處理參考信息并將其寫入新的業(yè)務(wù)處理請求中。當(dāng)然,本申請方案只需保證針對同一業(yè)務(wù)事件多次發(fā)送的業(yè)務(wù)處理請求中攜帶相同的業(yè)務(wù)處理參考信息即可,因此上述方式并不應(yīng)理解為對本申請方案的限定,例如,業(yè)務(wù)請求側(cè)也可以直接對首次生成的業(yè)務(wù)處理請求消息體的全部或一部分(其中至少應(yīng)包含首次使用的業(yè)務(wù)處理參考信息)進(jìn)行保存,后續(xù)有重發(fā)需求時,通過讀取預(yù)先保存的內(nèi)容就可以實現(xiàn)重發(fā),并且保證多次請求中攜帶的業(yè)務(wù)處理參考信 息相同。
s103,業(yè)務(wù)處理側(cè)接收到業(yè)務(wù)處理請求后,根據(jù)請求中攜帶的業(yè)務(wù)處理參考信息確定對應(yīng)的存儲位置;
本申請方案中,業(yè)務(wù)處理側(cè)需要根據(jù)業(yè)務(wù)請求側(cè)提供的業(yè)務(wù)處理參考信息來確定:處理當(dāng)前業(yè)務(wù)時,相關(guān)的數(shù)據(jù)處理操作需要在哪個數(shù)據(jù)庫(包括主庫/fo、分庫等)和/或哪張數(shù)據(jù)表中進(jìn)行。
例如:如果在業(yè)務(wù)處理請求中攜帶了時刻信息,則業(yè)務(wù)處理側(cè)可以根據(jù)該時刻信息確定對應(yīng)的時間維度數(shù)據(jù)分表;如果在業(yè)務(wù)處理請求中攜帶了數(shù)據(jù)庫運行模式信息,則業(yè)務(wù)處理側(cè)根據(jù)該信息判斷是使用主庫還是fo庫。
應(yīng)該理解的是,在實際應(yīng)用中,上述業(yè)務(wù)處理參考信息可能僅是用于確定存儲位置的一部分信息,例如:在基于“用戶編號”和“時間”的二維分表方案中,需要結(jié)合“發(fā)起當(dāng)前請求的用戶編號(該信息屬于業(yè)務(wù)請求中默認(rèn)攜帶的信息)”以及“時刻信息”來確定具體的數(shù)據(jù)分表;在確定主庫或fo庫后,還需要根據(jù)分表方案來進(jìn)一步確定數(shù)據(jù)分表,等等。當(dāng)然,“其他信息”都屬于根據(jù)現(xiàn)有技術(shù)方案可以正常獲取的信息,利用其他信息確定存儲位置也可以采用與現(xiàn)有技術(shù)一致的方案,這些并不影響本申請方案的實現(xiàn)。
s104,針對所確定的存儲位置進(jìn)行冪等檢查,并根據(jù)冪等檢查結(jié)果對當(dāng)前業(yè)務(wù)進(jìn)行處理;
在確定業(yè)務(wù)相關(guān)數(shù)據(jù)在數(shù)據(jù)庫中存儲位置的前提下,本申請方案中的冪等檢查可以采用與現(xiàn)有技術(shù)相同的方案,即:每次處理業(yè)務(wù)請求之前,將該業(yè)務(wù)請求的某種唯一標(biāo)識信息(例如“業(yè)務(wù)請求單號”、“業(yè)務(wù)請求單號+業(yè)務(wù)類型”、“業(yè)務(wù)請求單號+業(yè)務(wù)請求來源”等)插入當(dāng)前存儲位置對應(yīng)的冪等表,如果插入成功,說明業(yè)務(wù)系統(tǒng)是第一次處理該業(yè)務(wù)請求,則繼續(xù)正常的業(yè)務(wù)處理流程;反之如果插入失敗,則說明冪等表中已經(jīng)存在該業(yè)務(wù)的信息,即業(yè)務(wù)系統(tǒng)之前曾經(jīng)處理過該業(yè)務(wù)請求,那么可以直接確定該請求為重復(fù)請求,進(jìn)而停止處理該請求。當(dāng)然,本申請并不需要對具體的冪等檢查方案進(jìn)行限定。
下面結(jié)合將結(jié)合具體的應(yīng)用場景,對本申請的方案進(jìn)行說明:
假設(shè)在一個金融系統(tǒng)中,轉(zhuǎn)賬平臺側(cè)使用的業(yè)務(wù)數(shù)據(jù)庫部署情況如圖2所示,其中數(shù)據(jù)分表基于兩個維度:
在“用戶編號”維度:取用戶編號的其中2位,形成00-99共100個用戶分位。
在“時間”維度:按照1年12個月形成12個分位。
結(jié)合上述兩種維度,總共形成12*100共1200張分表,每張分表的命名規(guī)則為“用戶編號分位_月份分位”,且每張分表各自對應(yīng)一張冪等表。
此外,為了實現(xiàn)系統(tǒng)容災(zāi),將主庫中的數(shù)據(jù)全量備份到fo庫中,fo庫與主庫的分表結(jié)構(gòu)相同。正常狀態(tài)下,業(yè)務(wù)請求被路由到主庫(正常模式),災(zāi)備狀態(tài)下業(yè)務(wù)請求將被切換路由至fo庫(故障切換模式)。
假設(shè)用戶a(用戶編號為100002)希望向用戶b轉(zhuǎn)賬100元,通過應(yīng)用平臺向轉(zhuǎn)賬平臺發(fā)起轉(zhuǎn)賬請求。應(yīng)用平臺首次發(fā)起轉(zhuǎn)賬請求的時間為2015年11月30日23時59分,并且此時數(shù)據(jù)庫運行于正常模式,則應(yīng)用平臺將“2015-11-3023:59”以及“正常模式”寫入轉(zhuǎn)賬請求中。
轉(zhuǎn)賬平臺接收到上述轉(zhuǎn)賬請求后,首先根據(jù)請求中攜帶的信息確定存儲位置為主庫02_11表,然后執(zhí)行將該轉(zhuǎn)賬業(yè)務(wù)的流水單號插入主庫02_11表的冪等表的操作,由于插入成功,因此正常處理該業(yè)務(wù):將100元從賬戶a轉(zhuǎn)到賬戶b。
情景1:假設(shè)由于網(wǎng)絡(luò)問題,應(yīng)用平臺并沒有收到業(yè)務(wù)已成功處理的響應(yīng),于是判定為處理超時并重新向轉(zhuǎn)賬平臺發(fā)送第二次轉(zhuǎn)賬請求。第二次發(fā)起轉(zhuǎn)賬請求的時間為2015年12月1日00時01分,但是在第二次轉(zhuǎn)賬請求中,攜帶的存儲位置信息仍然為“2015-11-3023:59”以及“正常模式”。
轉(zhuǎn)賬平臺接收到第二次轉(zhuǎn)賬請求后,根據(jù)請求中攜帶的信息確定存儲位置為主庫02_11表,并進(jìn)一步執(zhí)行將該轉(zhuǎn)賬業(yè)務(wù)的流水單號插入主庫02_11表的冪等表的操作,由于冪等表中已經(jīng)存在相同的記錄,因此插入失敗,進(jìn)而停止處理本次轉(zhuǎn)賬請求,避免了錯誤的重復(fù)轉(zhuǎn)賬處理。
情景2:仍然假設(shè)由于網(wǎng)絡(luò)問題,應(yīng)用平臺并沒有收到業(yè)務(wù)已成功處理的響 應(yīng),于是判定為處理超時并重新向轉(zhuǎn)賬平臺發(fā)送第二次轉(zhuǎn)賬請求。第二次發(fā)起轉(zhuǎn)賬請求的時間為2015年12月1日00時01分,并且此時轉(zhuǎn)賬系統(tǒng)側(cè)的數(shù)據(jù)庫已經(jīng)切換至故障切換模式。但是在第二次轉(zhuǎn)賬請求中,攜帶的信息仍然為“2015-11-3023:59”以及“正常模式”。
轉(zhuǎn)賬平臺接收到第二次轉(zhuǎn)賬請求后,根據(jù)請求中攜帶的信息確定存儲位置為主庫02_11表,并進(jìn)一步執(zhí)行將該轉(zhuǎn)賬業(yè)務(wù)的流水單號插入主庫02_11表的冪等表的操作,但是此時主庫故障無法訪問,因此本次業(yè)務(wù)請求無法處理,結(jié)果是同樣避免了錯誤的重復(fù)轉(zhuǎn)賬處理。
可以理解的是,上述金融系統(tǒng)的應(yīng)用實例僅用于示意性說明,并不構(gòu)成對本申請方案應(yīng)用場景的限制。事實上,對于系統(tǒng)數(shù)據(jù)庫涉及數(shù)據(jù)分庫或多庫存儲、且不同的存儲位置(例如主庫/fo庫、分庫、分表等等)分別維護(hù)各自冪等表的應(yīng)用場景,都可以應(yīng)用本申請方案保證系統(tǒng)接口的冪等性。根據(jù)本申請方案,由于業(yè)務(wù)請求側(cè)針對同一業(yè)務(wù)事件多次發(fā)送的業(yè)務(wù)處理請求中所攜帶的業(yè)務(wù)處理參考信息都是相同的,因此本申請方案不會出現(xiàn)針對同一業(yè)務(wù)事件的多次冪等檢查在不同存儲位置進(jìn)行的情況,從而有效地避免業(yè)務(wù)重復(fù)處理的問題。
相應(yīng)于上述方法實施例,本申請還提供一種應(yīng)用于業(yè)務(wù)請求側(cè)的業(yè)務(wù)處理裝置,參見圖3所示,該裝置可以包括:
請求生成模塊110,用于生成攜帶業(yè)務(wù)處理參考信息的業(yè)務(wù)處理請求;
請求發(fā)送模塊120,用于將業(yè)務(wù)處理請求發(fā)送至業(yè)務(wù)處理側(cè),以使得業(yè)務(wù)處理側(cè)接收到業(yè)務(wù)處理請求后,根據(jù)請求中攜帶的業(yè)務(wù)處理參考信息確定對應(yīng)的存儲位置,針對所確定的存儲位置進(jìn)行冪等檢查,根據(jù)冪等檢查結(jié)果對當(dāng)前業(yè)務(wù)進(jìn)行處理;
其中,業(yè)務(wù)處理參考信息用于業(yè)務(wù)處理側(cè)確定當(dāng)前業(yè)務(wù)的相關(guān)數(shù)據(jù)在數(shù)據(jù)庫中的存儲位置,針對同一業(yè)務(wù)事件多次發(fā)送的業(yè)務(wù)處理請求中攜帶相同的業(yè)務(wù)處理參考信息。
在本申請的一種具體實施方式中,業(yè)務(wù)處理參考信息可以為時刻信息;
請求生成模塊110可以具體用于:針對同一業(yè)務(wù)事件,如果首次發(fā)送業(yè)務(wù) 處理請求,則獲取當(dāng)前的時刻信息,將該時刻信息寫入業(yè)務(wù)處理請求中,后續(xù)針對該業(yè)務(wù)事件重發(fā)的請求中均攜帶該時刻信息。
在本申請的另一種具體實施方式中,業(yè)務(wù)處理參考信息可以為數(shù)據(jù)庫運行模式信息,數(shù)據(jù)庫模式可以包括:正常模式、故障切換模式;
請求生成模塊110可以具體用于:針對同一業(yè)務(wù)事件,如果首次發(fā)送業(yè)務(wù)處理請求,則獲取業(yè)務(wù)處理側(cè)當(dāng)前所使用的數(shù)據(jù)庫運行模式信息,將該數(shù)據(jù)庫運行模式信息寫入業(yè)務(wù)處理請求中,后續(xù)針對該業(yè)務(wù)事件重發(fā)的請求中均攜帶該數(shù)據(jù)庫運行模式信息。
參見圖4所示,本申請還提供一種應(yīng)用于業(yè)務(wù)處理側(cè)的業(yè)務(wù)處理裝置,該裝置可以包括:
請求接收模塊210,用于接收業(yè)務(wù)請求側(cè)發(fā)送的業(yè)務(wù)處理請求,業(yè)務(wù)處理請求中攜帶業(yè)務(wù)處理參考信息;
業(yè)務(wù)處理模塊220,用于根據(jù)請求中攜帶的業(yè)務(wù)處理參考信息確定對應(yīng)的存儲位置,針對所確定的存儲位置進(jìn)行冪等檢查,根據(jù)冪等檢查結(jié)果對當(dāng)前業(yè)務(wù)進(jìn)行處理;
其中,業(yè)務(wù)處理參考信息用于業(yè)務(wù)處理側(cè)確定當(dāng)前業(yè)務(wù)的相關(guān)數(shù)據(jù)在數(shù)據(jù)庫中的存儲位置,業(yè)務(wù)請求側(cè)針對同一業(yè)務(wù)事件多次發(fā)送的業(yè)務(wù)處理請求中攜帶相同的業(yè)務(wù)處理參考信息。
在本申請的一種具體實施方式中,業(yè)務(wù)處理參考信息可以為時刻信息;
業(yè)務(wù)處理模塊220可以具體用于:根據(jù)請求中攜帶的時刻信息,確定與該時刻信息對應(yīng)的時間維度數(shù)據(jù)分表,針對所確定的數(shù)據(jù)分表進(jìn)行冪等檢查,根據(jù)冪等檢查結(jié)果對當(dāng)前業(yè)務(wù)進(jìn)行處理。
在本申請的另一種具體實施方式中,業(yè)務(wù)處理參考信息可以為數(shù)據(jù)庫運行模式信息,數(shù)據(jù)庫模式可以包括:正常模式、故障切換模式;
業(yè)務(wù)處理模塊220可以具體用于:根據(jù)請求中攜帶的數(shù)據(jù)庫運行模式信息,確定與該數(shù)據(jù)庫運行模式信息對應(yīng)的數(shù)據(jù)庫,針對所確定的數(shù)據(jù)庫進(jìn)行冪等檢查,根據(jù)冪等檢查結(jié)果對當(dāng)前業(yè)務(wù)進(jìn)行處理。
本申請還提供一種業(yè)務(wù)處理系統(tǒng),如圖5所示,該系統(tǒng)可以包括業(yè)務(wù)請求側(cè)裝置100及業(yè)務(wù)處理側(cè)裝置200,兩側(cè)裝置的具體實施方式可參見前面的實施例,本申請中不再重復(fù)說明。
通過以上的實施方式的描述可知,本領(lǐng)域的技術(shù)人員可以清楚地了解到本申請可借助軟件加必需的通用硬件平臺的方式來實現(xiàn)?;谶@樣的理解,本申請的技術(shù)方案本質(zhì)上或者說對現(xiàn)有技術(shù)做出貢獻(xiàn)的部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計算機軟件產(chǎn)品可以存儲在存儲介質(zhì)中,如rom/ram、磁碟、光盤等,包括若干指令用以使得一臺計算機設(shè)備(可以是個人計算機,服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本申請各個實施例或者實施例的某些部分所述的方法。
本說明書中的各個實施例均采用遞進(jìn)的方式描述,各個實施例之間相同相似的部分互相參見即可,每個實施例重點說明的都是與其他實施例的不同之處。尤其,對于裝置或系統(tǒng)實施例而言,由于其基本相似于方法實施例,所以描述得比較簡單,相關(guān)之處參見方法實施例的部分說明即可。以上所描述的裝置或系統(tǒng)實施例僅僅是示意性的,其中所述作為分離部件說明的模塊可以是或者也可以不是物理上分開的,在實施本申請方案時可以把各模塊的功能在同一個或多個軟件和/或硬件中實現(xiàn)。也可以根據(jù)實際的需要選擇其中的部分或者全部模塊來實現(xiàn)本實施例方案的目的。本領(lǐng)域普通技術(shù)人員在不付出創(chuàng)造性勞動的情況下,即可以理解并實施。
以上所述僅是本申請的具體實施方式,應(yīng)當(dāng)指出,對于本技術(shù)領(lǐng)域的普通技術(shù)人員來說,在不脫離本申請原理的前提下,還可以做出若干改進(jìn)和潤飾,這些改進(jìn)和潤飾也應(yīng)視為本申請的保護(hù)范圍。