隨着有贊支付體量的增大,資產部門承擔的資金管理,風險把控的責任也越大。咱們一方面要小步快跑,快速支撐業務,又要穩住底盤,守好底線。支付業務底線就是守護用戶的每一分錢,不能有資金損失。在咱們搭建這套體系前,有贊支付資金類的線上監控是個盲區,缺少自我發現的能力。業務成功了,但內部對用戶的資金操做多是錯誤的,致使資損。並且故障發生到發現的時間很長,且大部分是用戶上報,致使故障的影響面擴大,用戶的信任度下降。數據庫
預防資損有不少種手段,除了事前線下經過各類測試手段保障資金安全外,線上也是很是重要的一環。除了發現問題,相應的,出現故障時,資損止血的能力也須要配套跟上。安全
舉一個最基本的支付業務場景,在有贊內部會經歷如下幾個系統之間的交互架構
經過上圖能夠看出每一個系統的處理結果,會依據系統創建的模型存儲在數據庫中,部分關鍵信息會傳輸給下層系統。系統之間處理的重要信息如金額、帳戶不一致就會致使資損。目前咱們也內部對帳會發現這些問題,可是內部對帳都是天天跑批執行一次。若是依靠內部對帳來發現這個問題,資損早就發生了。須要調用很大的人力物力去追款,大部分狀況下還追不回來。咱們分析了有贊近一年來的資損場景,結合歷史的經驗,總結出資損類故障發生有幾下幾大類:異步
1)有正確的輸入,錯誤的輸出:好比系統與系統之間的金額存儲單位不一致,或者本身處理金額正確,傳輸給下游的金額錯誤,致使後面交易金額錯誤; 2)上下游系統的數據不一致:該處理的沒處理,該到達終態的單據沒有到達終態; 3)冪等控制失效,多扣款或多入帳; 4)系統內部邏輯錯誤,無對外輸出; 5)人工修復異常場景,產生資損。測試
基於解決以上問題的目的,咱們設計了實時防控資損體系。整體設計思路圍繞如下幾點:
1)發現問題的實時性,減小故障的影響面; 2)信息流一致性兩兩比對、資金流平衡型檢查; 3)全方位監控:業務觸發、人工變動資金檢測、歷史數據檢測; 4)檢測的準確性,無誤報; 5)和支付鏈路解藕,不影響主鏈路。設計
平臺能力是基礎,檢測規則是其靈魂。基於對業務的豐富經驗,咱們能夠沉澱一些業務資金規則,從旁路來約束和檢測系統邏輯的正確性。好比支付金額-退款金額應該==結算金額,退款金額不能大於支付金額,憑證支付、現金支付無資金流類型不用調用帳務,支付和帳務之間會通過結算的處理,帳務累計出入金額和支付的金額應該要相等。3d
系統定位於事前線下測試環境兜底,事中一致性檢測,過後資金兜底,不對業務形成入侵,徹底旁路運行。觸發點有 2 個,業務事件消息和數據庫變動 binlog 信息。cdn
分三類信息處理:blog
通過系統的沉澱以後,咱們將過程當中的數據存儲到了 hbase,把整個支付過程落地成了可視化試圖,可清晰的查看每一個環節的數據形態,具體數據就不展現了。
好比一筆訂單能夠看到,當前已是退款完成狀態,對應的支付成功時支付、結算、計費、帳務數據形態:事件
退款完成環節支付、結算、計費、帳務數據形態:
熔斷的處理流程圖以下:
基於咱們以前創建的異常發現能力,同時咱們須要具有資金止損能力。創建後臺觸發熔斷操做入口,人工錄入熔斷配置或資損防控檢測出異常新增並生效熔斷配置,應急狀況生效熔斷,平常支付鏈路不會過熔斷判斷。 熔斷支持按業務碼緯度、指定的單號、商戶號熔斷; 目前咱們在業務方接入的熔斷埋點有 3 個點:退款、結算、出金。爲何考慮這三個地方埋點呢?
創建了這一整套體系後,半年時間內,咱們已經在線下環境聯調時就成功兜底資金處理 bug,線上也避免了多起問題。並按期的進行故障演練來檢測平臺能力。 本文主要介紹大致的設計和實現思路,後續會有詳細的技術細節介紹,敬請期待。資損防控路漫漫,共勉。