如何設計千萬級資料的java對賬系統之一

2021-09-22 12:53:01 字數 2337 閱讀 3554

目前系統執行的對賬總情況:對賬日交易量兩千萬,交易金額50億,對賬時間5分鐘以內

本篇文章分兩個模組 第乙個模組主要文字描述下目前系統對賬的流程,第二個模組主要講述系統對賬的發展歷程

第乙個模組:

支付系統對賬主要幹些什麼事情呢,其實同樣的對賬系統差不多,每家公司業務不一樣,可能引申出來的含義不一樣但總體對賬流程大同小異。

支付對賬系統的設計時,一般將對賬系統分為五個模組,每個模組負責自己的職能。

檔案解析模組:建立不同的解析器,根據第三方對賬檔案解析適配成平台可以處理的對賬記錄

對賬處理模組:對賬的業務邏輯處理,根據解析到的第三方對賬單與支付訂單逐筆比對,這個是核心 第二個模組會詳細介紹

差錯處理模組:處理上述比對過程的差錯資料,針對不同的型別訂單進行沖正通知補單等

整個功能圖:

目前系統每天定時設定通道任務(任務建立優先大通道 同時任務時間盡量錯開),

2、檔案解析

對賬檔案中包含的主要資訊有:商戶訂單號、交易流水號、交易時間、支付時間、付款方、交易金額、交易型別、交易狀態這些字段。

4、對賬處理

對賬處理也是對賬的核心邏輯,具體分為以下的幾個步驟來實現:

a.查詢平台交易的訂單

b.查詢第三方支付對賬單

c.以銀行訂單為基準對賬邏輯:以銀行的交易資料為基準,遍歷所有平台的交易(包括未成功的訂單),找出訂單號相同但支付狀態不一致的訂單,在進行對比金額存入差錯池。如果沒有在平台的交易中找到此訂單,再從快取池中遍歷查詢,找到對應的平台訂單驗證金額是否一致,不一致進入差錯池。如果在快取池匯中依然沒有找到對應的訂單,直接進入差錯池,記錄平台漏單。同時統計對賬相關金額和訂單數。

注意系統設計時 需要考慮對賬的可擴充套件性,比如使用以第三方平台訂單為準對賬 或者只用本地對賬單對賬(在第三方對賬單沒到賬之前 臨時對賬特別有用) 具體來說可以通過通道任務來設定

需要對賬:比金額====一致  獲取對平的訂單的對賬結果 --》 分發佇列 queue分發 

比金額====不一致  進入異常訂單

平台有第三方沒有  進入異常訂單 平台掛賬

本地對賬:獲取對平的訂單的對賬結果  --》 分發佇列 queue分發 

第三方有,本地沒有:代表平台改天沒有資料或平台庫里都沒這筆訂單:

成功訂單,呼叫第三方介面去同步訂單的狀態,時間 金額 並寫入資料庫繼續比對

記錄平台少訂單的異常記錄

5、對賬統計

根據對賬處理中,統計的相關資訊包括:對賬完成時間、對賬是否成功、平賬的金額和訂單數、差錯的金額和訂單數、商戶日結資料,商戶品牌費等其他資訊。

6、差錯處理

在一般系統中,差錯處理分為兩種,一種人工來處理,一種系統自動來處理。

主要有如下情況:

本地未支付,第三方已支付。這主要是本地未正確接收到第三方下發的非同步通知導致。 一般處理是將本地狀態修改為已支付,mq通知業務方即可。

本地已支付,第三方支付已支付,但是金額不同,這個需要人工核查。

本地已支付,但是第三方支付中無記錄;或者本地無記錄,第三方支付有記錄。前者需要掛賬處理 後者是銷賬處理,具體原因需具體分析

支付訂單掛帳:第三方賬單今天沒有推送這筆訂單(這筆訂單也不會結算錢給我們),我們就要把這個訂單掛帳,並且是不結算(第三方沒個我們錢,我們也不能結算給商戶)

支付訂單銷賬:第三方賬單第n天推送了這筆訂單(這筆訂單今天的錢給我們了),我們就要把這個訂單銷賬,並且要結算(第三方給了我們錢,我們就要結算給商戶、渠道)

第二個模組  講述本系統從無到有 ,以及一些變更 優化的點

當時情況

優缺點目標

v1.0初期

當時考慮就是快速上線 基本考慮的是純記憶體+多執行緒方式

優點是快速上線滿足目前業務 缺點是針對交易量大時 記憶體占用過多

快速上線 支援訂單百萬級 交易金額十億內 對賬時間半個鐘頭

v2.0 中期 線上

採用通道+商戶hash+redis快取+jdbc分時訂單獲取方式

優點通過通道和商戶hash將資料隔離 可以快速擴機多台 缺點是對賬時 第三方對賬單解析後純記憶體 記憶體還是占用過高

支援訂單千萬級 交易金額五十億內 對賬時間五分鐘

v3.0 規劃

解決v2.0問題 同時優化資料庫查詢

減少記憶體消耗

訂單通知改用mysql,訂單表和訂單明細表合二為一 去掉不必要索引

SQL千萬級資料設計和優化

1.資料太多。放在乙個表肯定不行。比如月週期表。乙個月1000萬,一年就1.2億,如此累計下去肯定不行的。所以都是基於乙個週期資料乙個表。甚至乙個週期資料就要分幾個分表。主要是考慮實際的資料量而定。當你建立乙個新錶時,可能這個表需要有索引,但是都要先取消索引,或者先建立表,匯入資料後,再建立索引。必...

MySQL使用儲存過程插入千萬級資料如何提公升效率?

mysql測試任務 使用儲存過程,往表中插入千萬級資料,根據索引優化速度 1.使用索引查詢 2.不使用索引查 3.比較兩者查詢速度的差異 1.建立索引測試表 drop table if exists index test create table index test id bigint 20 pr...

mysql千萬級資料大表該如何優化

1.資料的容量 1 3年內會大概多少條資料,每條資料大概多少位元組 2.資料項 是否有大字段,那些欄位的值是否經常被更新 3.資料查詢sql條件 哪些資料項的列名稱經常出現在where group by order by子句中等 4.資料更新類sql條件 有多少列經常出現update或delete ...