大家好,我是蝸牛哥,跨系統(tǒng)轉(zhuǎn)賬網(wǎng)上教程很多,但是都是講的比較淺,這個功能看似簡單,但是細節(jié)很多,要做好沒那么容易,因為涉及到分布式事務(wù)、交易安全性等方面,做不好就出現(xiàn)資損,本文講一下如何設(shè)計一個高可靠跨系統(tǒng)轉(zhuǎn)賬,以及要關(guān)注的重點 示例說明假設(shè)有用戶 A在 銀行A 轉(zhuǎn)賬給B銀行的用戶B 100 元
會遇到哪些問題?轉(zhuǎn)賬失敗,不能直接回滾要根據(jù)返回的異常來判斷,如果接收到的異常是一個業(yè)務(wù)異常,并且異常碼是雙方約定好的,那么可以進行回滾,如果返回的不是一個明確的異常,,那么不能擅自回滾,因為可能是網(wǎng)絡(luò)超時異常,而網(wǎng)絡(luò)超時,又分為響應(yīng)超時和請求超時,如果是響應(yīng)超時,對方系統(tǒng)可能已經(jīng)入賬了,所以要進行重試操作確認
系統(tǒng)重試要保持冪等假如網(wǎng)絡(luò)超時進行重試,入金方的接口需要支持冪等,否則會出現(xiàn)可能重復入金,而冪等條件是根據(jù)出金方的
如果失敗,那么出金方需要進行解凍回滾操作,如果成功,那么需要進行解凍出金操作。 同時入金方還要設(shè)置此組合字段為 交易安全性由于這種資產(chǎn)操作非常敏感,稍有失誤影響非常大,所以交易安全性是非常重要的,比如:有攻擊者知道B銀行的入金接口,那么直接調(diào)用,他的賬戶就會加錢。。。,所以要進行以下安全措施 要進行簽名調(diào)用在轉(zhuǎn)賬前用私鑰對賬戶進行簽名,然后給B銀行頒發(fā)一個公鑰,進行入金的簽名驗簽操作,來保證此請求是正常請求。 要對交易的時效性進行校驗為了進一步保證交易的安全性,雙方要約定好一個交易的時效性,比如5 分鐘,在進行接口調(diào)用時攜帶請求時間,如果這個請求時間是5分鐘之前的進行拒絕,等待重新發(fā)起。 要進行系統(tǒng)對賬除了簽名,雙方系統(tǒng)還要進行對賬,而對賬又分為總賬對賬和明細對賬 總賬對賬比如查看銀行A出金總額是否等于B銀行的入金總額,對賬頻率有小時、天不等,計算公式如下
明細對賬除了總賬要進行核對,明細賬也要進行核對,因為總賬不平后,要確保那一個賬戶出現(xiàn)問題,為了實現(xiàn)明細對賬雙方系統(tǒng)要保留對方系統(tǒng)流水號,這樣才能對應(yīng)起來,對賬頻率一般是天 要考慮并發(fā)扣款在進行賬戶操作時,要考慮并發(fā)問題,進行加鎖處理,否則會出現(xiàn)資損,例如
具體可以查看并發(fā)扣款,如何保證結(jié)果一致性 涉及到表可能有哪些?出金方轉(zhuǎn)賬流水表
賬戶表此表的作用不用多說,主要說下凍結(jié)資金密度,防止真正扣款時賬戶上沒錢,導致交易失敗,所以一般都是先進行凍結(jié),如果失敗則進行解凍
凍結(jié)記錄表記錄凍結(jié)流水,防止出問題沒法追溯
入金方以下表為最核心的表,但不是最全的表,比如應(yīng)該還有賬賬務(wù)流水表、賬務(wù)訂單、熱點賬戶表等 渠道轉(zhuǎn)賬流水表
賬務(wù)表
最終流程應(yīng)該是什么樣的?流程有4個,分別為
轉(zhuǎn)賬流程轉(zhuǎn)賬補償流程這個流程是定時任務(wù)定時發(fā)起的,
總賬對賬流程明細對賬流程明細對賬,如果數(shù)量不大,一天天對沒問題,現(xiàn)在銀行大多數(shù)是基于這種做法,如果文件比較大,可以考慮使用Merkle樹,這里就說傳統(tǒng)的方式 直接查詢對比這種方式最快,數(shù)據(jù)不大可以這樣搞,同時也需要對方系統(tǒng)提供接口支持 基于文件對比這種方式也是比較常用的方式,適合數(shù)據(jù)量大的對比,一般銀行會這么做 總結(jié)以上我們介紹了如何設(shè)計一個高可靠的系統(tǒng)轉(zhuǎn)賬,可以看到還是比較復雜的,細節(jié)很多,主要要考慮補償、安全、并發(fā)扣款幾方面,這幾方面做好才能設(shè)計一個高可靠的系統(tǒng)轉(zhuǎn)賬。 掃描下面的二維碼關(guān)注我的微信公眾帳號,在微信公眾帳號中回復?加群?即可加入到我們的技術(shù)討論群里面共同學習。 |
|