對(duì)賬系統(tǒng)設(shè)計(jì)

更多支付內(nèi)容請(qǐng)移步個(gè)人站:YKBLog.top

對(duì)賬整體設(shè)計(jì)


從整體來(lái)看,按照時(shí)序維度的先后,系統(tǒng)對(duì)賬主要分為三階段的工作。分別是數(shù)據(jù)準(zhǔn)備、數(shù)據(jù)核對(duì)和差錯(cuò)處理。

  • 數(shù)據(jù)準(zhǔn)備細(xì)分一下,又分為文件獲取、文件解析、數(shù)據(jù)清洗。

在對(duì)賬專(zhuān)業(yè)概念中,數(shù)據(jù)核對(duì)和差錯(cuò)處理又叫軋賬和平賬。
具體設(shè)計(jì)腦圖如下:

check-arch.png

對(duì)賬各個(gè)模塊設(shè)計(jì)


數(shù)據(jù)準(zhǔn)備

數(shù)據(jù)準(zhǔn)備,顧名思義,我們需要把對(duì)賬所需的全部數(shù)據(jù),接入到我們的對(duì)賬系統(tǒng)。

該模塊主要實(shí)現(xiàn)兩個(gè)目標(biāo):

  • 為不同的外部系統(tǒng)提供多元化的接入機(jī)制。
  • 通過(guò)數(shù)據(jù)適配的手段把外部數(shù)據(jù)以統(tǒng)一的格式進(jìn)行轉(zhuǎn)換和存儲(chǔ)。

在數(shù)據(jù)接入層,我們會(huì)針對(duì)不同的數(shù)據(jù)接入方提供三種不同的數(shù)據(jù)接入模式。如下圖:

check-data-deal.png

數(shù)據(jù)拉取

主動(dòng)拉取數(shù)據(jù),并通過(guò)數(shù)據(jù)適配的方式,將數(shù)據(jù)存儲(chǔ)到對(duì)賬數(shù)據(jù)池中。

數(shù)據(jù)推送

指定標(biāo)準(zhǔn)規(guī)范和格式,供各個(gè)接入方使用,統(tǒng)一格式推送到對(duì)賬服務(wù)。

人工上傳

提供標(biāo)準(zhǔn)的文件模板,由業(yè)務(wù)接入方填充數(shù)據(jù),通過(guò)后臺(tái)文件上傳或SFTP上傳工具的方式將數(shù)據(jù)上傳到對(duì)賬服務(wù)。

check-data-file.png

人工上傳文件處理方式步驟如下:

  1. 下載文件
    從指定SFTP服務(wù)器下載文件。
  2. 解壓文件
    一般為zip壓縮包,節(jié)省存儲(chǔ)空間,提高上傳和下載速度。
  3. 解析文件
    一般文件格式為EXCEL(財(cái)務(wù)人工上傳文件,一般從銀行或第三方支付后臺(tái)下載)、CSV(數(shù)據(jù)接入方一般從數(shù)據(jù)庫(kù)導(dǎo)出格式,或第三方支付提供的文件格式)、TXT。
  4. 存儲(chǔ)數(shù)據(jù)
    將第三步得到的數(shù)據(jù)存儲(chǔ)、持久化到數(shù)據(jù)庫(kù),一般底稿數(shù)據(jù)都存儲(chǔ)最全數(shù)方便問(wèn)題追溯。

數(shù)據(jù)清洗

顧名思義,即對(duì)準(zhǔn)備的上下游數(shù)據(jù)進(jìn)行清洗。

清洗的作用或原因:
從底稿提取對(duì)賬核心字段
  一般參與對(duì)賬的字段就幾個(gè),具體字段:銀行卡號(hào)、銀行單號(hào)、業(yè)務(wù)單號(hào)、支付金額、支付方式、支付完成時(shí)間、核對(duì)狀態(tài)。
  上文提到底稿一般建議存儲(chǔ)所有數(shù)據(jù),數(shù)據(jù)太多影響對(duì)賬性能和效率。
合并、排除無(wú)用數(shù)據(jù)
  上文提到底稿一般建議存儲(chǔ)所有數(shù)據(jù),難免有無(wú)用數(shù)據(jù)需要剔除,或者排除業(yè)務(wù)或財(cái)務(wù)指定無(wú)需對(duì)賬的數(shù)據(jù);合并特殊業(yè)務(wù)或流程產(chǎn)生的N對(duì)1數(shù)據(jù)。

數(shù)據(jù)核對(duì)

對(duì)賬的核心
  數(shù)據(jù)核對(duì)是對(duì)賬的核心,對(duì)賬的主邏輯;一般對(duì)賬方式有兩種,即對(duì)明細(xì)賬和對(duì)總賬,對(duì)總賬一般包括總金額和總條目。一般做法為對(duì)明細(xì)賬,即上下游每條記錄逐一比對(duì)。
核對(duì)的結(jié)果
  核對(duì)一般就是兩個(gè)結(jié)果:對(duì)上帳和對(duì)不上賬,對(duì)不上賬有分三種結(jié)果,上游單邊(支付中一般稱(chēng)為企業(yè)單邊,即長(zhǎng)款),下游單邊(支付中一般稱(chēng)為銀行邊,即漏單),金額不等(即兩邊都有數(shù)據(jù),金額對(duì)不上)。
設(shè)計(jì)normal和different兩張表,分別存儲(chǔ)不同的核對(duì)結(jié)果數(shù)據(jù),方便后期統(tǒng)計(jì)以及為業(yè)務(wù)提供能力。

check-data-check.png

具體對(duì)賬的方法有多種,比如:

  1. sql核對(duì)
    exist insert select
    最簡(jiǎn)單的方式,也是問(wèn)題比較多方式,對(duì)數(shù)據(jù)庫(kù)壓力比較大,數(shù)據(jù)特別多的時(shí)候,對(duì)賬效率比較低。
  2. redis核對(duì)
    set集合分別diff (inter)上游、下游數(shù)據(jù)
    比較好的方式,可以降低數(shù)據(jù)庫(kù)壓力,redis方便根據(jù)數(shù)據(jù)量做水平擴(kuò)展。
  3. sprak核對(duì)
    采用流式運(yùn)算進(jìn)行比對(duì);(具體做法待擴(kuò)展)

差錯(cuò)處理

在一般系統(tǒng)中,差錯(cuò)處理分為兩種,一種人工來(lái)處理,一種系統(tǒng)自動(dòng)來(lái)處理。
  人工處理一般兩個(gè)操作:平賬和勾兌,勾兌一般處理的是單邊情況,比如由于系統(tǒng)bug出現(xiàn)的單邊問(wèn)題,經(jīng)由人工溯源修復(fù)bug之后,相關(guān)業(yè)務(wù)人員即可在對(duì)賬后臺(tái)將該條數(shù)據(jù)進(jìn)行勾兌。
  系統(tǒng)自動(dòng)處理一般為:自動(dòng)補(bǔ)單和驅(qū)動(dòng)下游流程完成兩種方式。主要有如下情況:
下游單邊(銀行單邊)情況
  業(yè)務(wù)未支付,支付渠道已支付。這主要是本地未正確接收到渠道下發(fā)的異步通知導(dǎo)致。
  一般處理是將本地狀態(tài)修改為已支付,并做響應(yīng)的后續(xù)處理,比如通知業(yè)務(wù)方等。
上游單邊(企業(yè)單邊)情況
  業(yè)務(wù)已支付,但是支付渠道中無(wú)記錄;或者本地?zé)o記錄,支付渠道有記錄。
  在排除跨日因素外,這種情況非常少見(jiàn),需要了解具體原因后做處理。
金額不等情況
  業(yè)務(wù)已支付,支付渠道已支付,但是金額不同,這個(gè)需要人工核查。

對(duì)賬統(tǒng)計(jì)

根據(jù)對(duì)賬處理結(jié)果,統(tǒng)計(jì)的數(shù)據(jù)由:匯總總條目、匯總總金額、匯總差異結(jié)果、匯總單邊結(jié)果、匯總處理結(jié)果。
  業(yè)務(wù)和財(cái)務(wù)關(guān)系的統(tǒng)計(jì)的相關(guān)信息有:對(duì)賬完成時(shí)間、對(duì)賬是否成功、平賬的金額和訂單數(shù)、差錯(cuò)的金額和訂單數(shù)、緩存池金額和訂單數(shù)等。

check-result.png

對(duì)賬系統(tǒng)相關(guān)設(shè)計(jì)


分布式定時(shí)系統(tǒng)

一般對(duì)賬系統(tǒng)都是N+1離線(xiàn)對(duì)賬,所有上述所有模塊的設(shè)計(jì)一般使用定時(shí)任務(wù)去執(zhí)行。不可能所有模塊、所有銀行卡都用一個(gè)任務(wù)去執(zhí)行,也不可能只用一臺(tái)機(jī)器去執(zhí)行,這樣一天可能都跑不完所有的數(shù)據(jù)。
  所以考慮到優(yōu)化,一般設(shè)置為集群分布式的去跑任務(wù),所以涉及一個(gè)分布式定時(shí)系統(tǒng)對(duì)對(duì)賬系統(tǒng)來(lái)說(shuō)很重要,考慮成本和時(shí)間問(wèn)題,可以簡(jiǎn)單實(shí)現(xiàn)分布式任務(wù)效果。分布式定時(shí)系統(tǒng)的設(shè)計(jì)后續(xù)再單獨(dú)探討。
  即使所有任務(wù)都按模塊化去進(jìn)行劃分,按模塊化單獨(dú)起任務(wù)去執(zhí)行業(yè)務(wù)邏輯,也會(huì)存在時(shí)間效率的瓶頸(因?yàn)橄挛奶岬降囊蕾?lài)關(guān)系,導(dǎo)致并不能讓所有的任務(wù)都并行起來(lái))。再加上銀行卡號(hào)比較多的情況下,最好情況就是各個(gè)銀行卡號(hào)并行處理,即并發(fā)粒度設(shè)計(jì)到銀行卡號(hào)維度,使用多線(xiàn)程把所有銀行卡的對(duì)賬任務(wù)并行起來(lái)。

依賴(lài)鏈設(shè)計(jì)

所有模塊是存在依賴(lài)關(guān)系的,比如清洗之前,肯定要數(shù)據(jù)準(zhǔn)備完成;但是上游數(shù)據(jù)和下游數(shù)據(jù)的準(zhǔn)備、清洗可以并發(fā)的執(zhí)行。整體依賴(lài)鏈如下:


check-depend.png

核心對(duì)賬優(yōu)化

上文模塊設(shè)計(jì)有提到核心對(duì)賬的多種實(shí)現(xiàn)思路,這里推薦的兩種:

  1. redis 實(shí)現(xiàn)
  2. sprak 實(shí)現(xiàn)
    具體實(shí)現(xiàn)過(guò)程會(huì)在后續(xù)博文中詳細(xì)介紹。

對(duì)賬系統(tǒng)數(shù)據(jù)庫(kù)模型


按以上設(shè)計(jì)模型,具體數(shù)據(jù)模型如下介紹。

底稿數(shù)據(jù)表

  • 各個(gè)上游數(shù)據(jù)、下游數(shù)據(jù)抓取、解析的底稿數(shù)據(jù) 。
  • 不只兩張表,由具體業(yè)務(wù)決定;數(shù)據(jù)量比較大,一般按日期水平分表,按實(shí)際業(yè)務(wù)考慮要不要垂直分表。

清洗表

  • 從各個(gè)上游數(shù)據(jù)、下游數(shù)據(jù)的底稿數(shù)據(jù)取部分字段。
  • 不只兩張表,由具體業(yè)務(wù)決定;數(shù)據(jù)量比較大,一般按日期分表。

對(duì)賬結(jié)果表

  • 正常表
    用來(lái)存放對(duì)上賬的數(shù)據(jù)(即對(duì)賬結(jié)果正常的數(shù)據(jù),一般數(shù)據(jù)量比較大,需要按日期分表)
  • 異常表
    用來(lái)存放對(duì)不上賬的數(shù)據(jù)(上游單邊、下游單邊、金額不等)。

對(duì)賬匯總表

即對(duì)對(duì)賬數(shù)據(jù)的匯總

技術(shù)相關(guān)表

定時(shí)配置、賬戶(hù)配置、異常信息等等相關(guān)表

更多支付內(nèi)容請(qǐng)移步個(gè)人站:YKBLog.top

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容