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