对账系统 #
业务需求 #
- 双向对账。先以平台方数据为基准,再以渠道方数据为基准。
- 总账结合明细账。总账平不代表明细账平,业务系统刚上线时可以直接对明细账。进入平稳期后为提高对账效率,可以先对总账,不平后再对明细账。
- 对账依据:
- 平台方信息流数据与资金流数据进行对账。
- 平台方资金流数据与渠道方资金流数据进行对账。
- 平台资金流数据与平台账户余额数据进行对账。
- 对账方法
- 只实时对账。对账成功的数据成为待清算数据。
- 只批处理对账。对账成功的数据成为待清算数据。
- 实时对账+批处理对账。实时对账防止出金资损,批处理对账做兜底保护。批处理对账成功的数据成为待清算数据。
实时对账 #
消息队列实时对账 #
- 实时通过消息队列获取平台支付订单。
- 调用渠道接口实时获取渠道交易结果。
- 将支付订单信息和渠道交易结果进行对账,对账成功的数据作为待清算数据。
- 渠道返回交易成功:
- 金额不一致,对账失败,记为差错记录,等待人工处理。
- 金额一致,
- 支付系统返回成功,对账成功,支付数据可作为待清算数据。
- 支付系统返回失败,对账商标,记为差错记录,等待人工处理。
- 支付系统返回处理中,对账成功,自动纠错,更新支付数据为交易成功。
- 渠道返回交易失败:
- 支付系统返回成功,对账失败,记为差错记录,等待人工处理。
- 支付系统返回失败,对账成功。
- 支付系统返回处理中,对账成功,自动纠错,更新支付数据为交易失败。
- 渠道返回交易不存在:
- 对账失败,记为平台长款,等待人工处理。
- 渠道返回交易成功:
- 按清算周期生成商户对账文件,推送给商户。
- 根据对账文件和商户进行结算。
- 提供异常单查询功能供商户查看未及时进行结算的交易。
Flink实时对账 #
同时读入两条流的数据来做合并处理。利用connect将两条流进行连接,然后用collect进行处理或者使用join。
分布式实时对账 #
- 各交易流水同步到实时对账系统。
- 调度器根据流水号分片,将新对账任务交给分区对账节点。
- 对账节点扫描交易发起方和接收方的记录数据,生成对账结果。为了防止主从延迟,接收到对账请求后延迟一段时间后再执行。
批处理对账 #
存疑帐,缓存数据表
差集对账 #
- 利用pipeline功能将平台方支付数据(流水号+交易金额)批量插入Redis的Set中。
- 利用pipeline功能将渠道方支付数据(流水号+交易金额)批量插入Redis的Set中。
- 以平台支付订单为基准,利用sdiff,找出平台方差集。
- 以渠道方支付订单为基准对账,利用sdiff,找出渠道方差集。
- 根据差集结果区分金额不一致、平台方长款和平台方短款。
HashMap对账 #
- 利用Hmset将平台方支付数据(流水号+交易金额)批量插入Redis的Hash表中,key=流水号。
- 利用Hmset将渠道方支付数据(流水号+交易金额)批量插入Redis的Hash表中,key=流水号。
- 以平台支付订单为基准,获取渠道方Hash表中的数据,进行对比。
- 金额一致,对账成功,删除双方Hash表中的数据。
- 金额不一致,对账失败,记为差错记录,删除双方Hash表中的数据。
- 渠道方不存在,对账失败,平台长款,记为差错记录,删除渠道方Hash表中的数据。
- 检查渠道方Hash表中是否还有数据,还存在的数据记为平台短款,记为差错记录。
滚动对账 #
- 平台方数据和渠道方数据按流水号有序保存在数据库中。
- 从平台方数据和渠道方数据中各取N条数据。
- 从第1条开始对比,流水号和金额都一致则双方游标向后滑动一条记录。
- 金额不一致则记为差错数据,转人工处理,双方游标向后滑动一条记录。
- 流水号不一致,较小的一方记为差错数据,转人工处理。较小一方的游标向后滑动一条记录。
- N条数据用完后,再取N条数据放入内存中,重复对账过程。
哈希对账 #
可以节约对账文件的传输时间。
- 渠道方将数据按批次划分,划分依据可以是累计N个交易或N元。
- 渠道方对某一批次的数据进行hash计算。如果数据较多,可以对该批次进行分片,计算出一组hash值。
- 渠道方将hash值发送给平台方。
- 平台方使用同样算法从数据库抽取数据进行计算。
- 双方hash值一样则对账成功。否则要求渠道方发送对账文件。
基于数据库变更对账 #
- 在对账系统录入对账任务和过滤器。任务可以是Grooy脚本,参数为data1和data2,脚本经过解析后保存到Redis中。
- 利用canal获取数据库变更记录,推送到消息队列上。
- 对账系统消费消息,从Redis中获取最新的过滤器后,对数据进行过滤,过滤条件可以是insert、update、delete,或者某列为特定值等。
- 对账系统从Redis中获取对账任务缓存。
- 执行对账任务。