对账业务系统实践
发布日期:2021-05-24 16:18:20 浏览次数:48 分类:技术文章

本文共 3771 字,大约阅读时间需要 12 分钟。

  在做对账系统的业务,虽然我只是一个CRUD工程师,但是还是希望能有自己的想法,在摸着石头过河的过程中,自己也是谷歌了对账的方案。

  对于对账系统的完整设计方案,其实谷歌出来的并不多,甚至说,还能看的其实就一篇,最早的这篇文章是出自作者纯洁的微笑,这个人我很熟悉,也曾有幸与之交流过,受到他的指点迷经。后来网上的对账系统的解决方案的都是复制粘贴的他的,甚至是有的人连原文地址都不放。我相信这篇文章是微笑哥的原作,因为他就是做的第三方支付公司。并且做到了很高的级别。

  对于这篇文章,还是很精彩的,我先贴一下原文地址:

  而我要写的这篇文章,将对对账系统的设计,加上我的理解,以及我们自己的设计方案,加一描述。

  这篇文章主要采用带着问题找答案的形式展开,这是我们自己的探索过程。

  这篇文章我会持续的沉淀,这是一个很有意思的业务,也是很重要的一个业务场景。有可能我在最开始的时候只做一个简单的描述,并没有给出具体的实现方案,但是我我会持续的去更新。

 

# #  对账都有哪些问题

 第一个问题是:对账系统的整个流程是什么。

 第二个问题是:财务的基本概念,这一块我们要有基本的理解。

 第三个问题是:和客户传输对账数据应该怎么做。

 第四个问题是:对于对账数据有什么好的比对方案,对于千万级别的大数据,用什么处理方案比较好一点。采用什么算法最好。

 第五个问题是:比对数据之后,产生的差异数据怎么处理。

 第六个问题是:如果对账过程出错以后怎么办,是重新进行对账,还是有什么方案继续对账。

 第七个问题是:一定要考虑安全问题,一方面是服务器安全,比如大量的比对数据,肯定不能一下子加载到内存中,一方面是传输安全问题。

问题序号 问题描述 是否解决 是否给出实现细节 备注信息
第一个问题 对账系统的整个流程是什么      
第二个问题 财务的基本概念,这一块我们要有基本的理解      
第三个问题 和客户传输对账数据应该怎么做      
第四个问题 对于对账数据有什么好的比对方案,对于千万级别的大数据,用什么处理方案比较好一点。采用什么算法最好      
第五个问题 比对数据之后,产生的差异数据怎么处理      
第六个问题 如果对账过程出错以后怎么办,是重新进行对账,还是有什么方案继续对账      
 第七个问题 一定要考虑安全问题,一方面是服务器安全,比如大量的比对数据,肯定不能一下子加载到内存中,一方面是传输安全问题。      

 

# # 对账系统的整个流程是什么

  对于这个问题,产生的基本概念的名词可能会有点陌生,可以接着看第二问题会给出来。

  财务系统业务流程:记账—对账—结账—结算

  财务银行业务流程:清分—清算

  对账系统整体处理:

 

# # 财务的基本概念

1、会计恒等式:(借方)资产+费用=(贷方 所有资金来源)负债+所有者权益+收入

2、记账基本概念:就是把一个企事业单位或者个人家庭发生的所有经济业务运用一定的记账方式在账簿上记录,是一种记录。售、退、改存根相当于记账。

3、对账基本概念:

        a.简而言之是对一个清算周期(如按周、按月、按年等)的交易信息进行核对,以确认交易信息的一致性和正确性的过程。

        b.目前社会上90%的财务对账由系统自动完成。

        c.对账对象一般是收入,一般提“收入”时候,是含税的。如果不含税,需要特别说明。收支两条线:当天的收入和支出,其中支出(例如退票)可能订票日期是几天前,但不会翻旧账到几天前。

        d.对账方式:业务系统出业务数据,财务出财务数据,这部分是内部对账。业务和财务对完账,再去和商家对账,这部分是外部对账。内部对账成功以后再和外部去对账。

4、结账基本概念:

        a.一定时期内发生的全部经济业务登记入账基础上,计算并记录本期发生额和期末余额。结账是在记账完毕、检查对账完毕,确保无误后的最后一步操作。结账分为:月结、季结、年结三种。结账不包含结账日之后的退款。

        b.滚动结账:如第一天进100元,第二天退200元,第二天也不给企业退钱,等第三天再进账进行抵消当与客户合作结束后还有需要退款再做最后结算这个事情还需要和车站代售点商谈

       c.结账周期:T+N,就是当前日期加上几天。

5、结算基本概念:

        a.按结算批付钱。一般情况下,对各家客户时,账户只进不出,只有在合同结束时候,再跟企业清算。

         b.如果系统对账模式,结账完成后,需要财务点击“批付”,就可以转账了。如果是线下模式,需要Excel结账单,盖章后,转账。

 

# #  和客户传输对账数据应该怎么做

  大多数银行都要求接入方提供ftp服务,银行定时将对账单推送到接入方提供的ftp服务器上面;还有一部分银行会提供对账单的下载服务,通过ftp/http的都有,ftp方式居多;另外网银的对账单比较特殊,一般都需要结算登录网银的后台管理系统中,手动下载,结算下载完对账单后在导入到对账系统。

  走ftp通道,是不安全的,如果加上安全,就用SFTP。

  这里包括搭建SFTP服务器~

  技术实现上可以做成工厂模式,不同的支付渠道有不同的下载类,如果是http接口将文件写入到对账单,如果是ftp服务器,将服务器中的对账单下载到本地带解析的目录中。主要涉及的代码ftp工具类、http(s)工具类,相关IO读写。

  技术选型上,HTTP(S)用apache httpclient即可实现链接池和断点续传, FTP也可以使用Apache Commons Net API。 但不管是哪一个,都需要设置重试次数和链接超时间。重试次数和间隔的设置需要小心,重试太频繁,容易把服务器打死.;时间间隔太大,又会阻塞后续处理步骤。5~10分钟是一个合适的重试间隔区间。

 

# # 对于对账数据有什么好的比对方案,对于千万级别的大数据,用什么处理方案比较好一点。采用什么算法最好

   这个问题,一定要考虑的有非常多的对账数据需要比对的时候,千万不能一下子加载到内存中来。肯定是要分页去处理的。从纯洁的微笑的文章里边来看,它其实这样来做的,比方说 要比对的数据在 A表和B表,其中先遍历A表,然后每一条数据拿着两个表所能对应的比方说唯一主键,根据唯一主键查询B表的要比对的数据,如果异常就将数据记录到对账差异表。 同理,再遍历B表,然后再根据唯一主键,去查询A表,如果数据在A表能找到,并且需要比对的信息无差异,则继续比对B表的下一条数据。同理,如果数据在A表找不到,则在异常表将该异常信息给记下来。

  上边的做法,是多数人能够想到,但是每条数据都比对了两遍,是一定要比对两遍的。

  那有没有好的方案,可以比对一遍呢?

  我的思路是这样的,A表比方有1000条数据,然后对这一千条数据先排序然后分页取,然后放在A表的hashMap中去,B表也先排序然后分页取,然后放在B表自己的 hashMap中去,然后拿着一个表的hasMap 变量,然后去另外一个表的HashMap中去取,显然从hashMap中取数据的时间复杂度是 o(1),因为大多数理想情况下,没有异常数据,比对没有问题的数据则从两个表的hashMap中移除掉,这里注意一个问题,正在遍历的hashMap不能remove操作,否测会报错,一定要知道。方案,可以先将需要移除的给记录下来,等遍历结束,再去移除。而没有比对到的数据,还不能判断是异常数据,留在hashmap中不去管它,直到A表分页取完了,B也分页取完了,然后经过遍历比对以后,hashMap中的剩余的数据则是错误数据。这些数据是需要记异常表的。这样来看,只有出现异常的数据,才会重复的取比对,理想情况下,数据都是好的,应该都能比对,这是一个乐观问题,所重复比对的数据并不会太多。

  这里如果有人看到,有更好的比对方案,比对算法,希望能够告知,谢谢~

  这里是需要再去探索好的解决方案的。我提供的方案,虽然只比对一次,那么需要数据库排序,这可能会花费较多的东西,这里也需要研究研究数据库再说。另外还有一个问题分页取大表的数据,一千万级别则会非常耗时。

# # 比对数据之后,产生的差异数据怎么处理

    对于差异数据,其实只有三种情况,

  第一种: A平台的数据缺少;

  第二种:B平台的数据缺少;

  第三种:A B两个平台的数据有差异。

  对于三种不同的差异情况,其实有两种方案,一种是机器自动修复,那么这个一定是按照一个为准取修复,比方说以A平台为准,如果差异是A缺少数据,因为以A为准,所以就是B多计了。反之亦然。 对于机器修复数据的这种方案,其实应该添加一个通知机制,让相关的管理人员知道要数据产生差异了,这个可以接钉钉。

  第二种处理方案是人工处理,对于差错数据需要认为的找问题,则需要单独提供一个人工修复数据的API。

 

# # 如果对账过程出错以后怎么办,是重新进行对账,还是有什么方案继续对账

  这里有的人说,对于这个问题是出差错就则把之前的比对的全部推翻重新比对。

  另外一种方案,就是将比对没问题的数据表示一个已经完成对账,对对账出错的则标志一个对账异常,也就意味着,每比对完一条数据,则修改两个表的数据。多了两次操纵数据库的操作。

  综合比较,我个人觉得采用第一种方案比较好一点,因为问题是乐观的,像说的那种对账程序终止肯定是极少数的。

 

# # 一定要考虑安全问题

  一个是传输安全的问题,一个数比对服务器的安全问题,比方说是数据不能一下子全部取出来。

转载地址:https://blog.csdn.net/star1210644725/article/details/104635302 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:appliction.properties 和 application.yml 优先级问题
下一篇:一篇文章介绍 符号运算的妙用

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年03月14日 21时18分36秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

mysql redis缓存层_redis实现缓存的两种方式 2019-04-21
mysql索引篇_MySQL索引篇 2019-04-21
有至少一个用MySQL_Mysql有用的面试题 2019-04-21
java控制热敏打印机的例子.rar_stm32控制热敏打印机 2019-04-21
java clone equals_(原)java中对象复制、==、equals 2019-04-21
php7 memcached.exe,PHP7 下安装 memcache 和 memcached 扩展 2019-04-21
计算机二级java技巧,计算机二级报java难考吗 2019-04-21
php foreach 数据库,php – 使用foreach将数据库检索的数据排列在HTML表中 2019-04-21
拉格朗日matlab编程例题,Matlab习题讲解.doc 2019-04-21
case是不是php语言关键字,PHP语言 switch 的一个注意点 2019-04-21
linux php mkdir失败,linux – mkdir错误:参数无效 2019-04-21
config.php渗透,phpMyAdmin 渗透利用总结 2019-04-21
java list 合并 重复的数据_Java ArrayList合并并删除重复数据3种方法 2019-04-21
android volley 上传图片 和参数,android - 使用android中的volley将图像上传到multipart中的服务器 - 堆栈内存溢出... 2019-04-21
android开发的取消清空按钮,Android开发实现带清空按钮的EditText示例 2019-04-21
android gp服务,ArcGIS Runtime SDK for Android开发之调用GP服务(异步调用) 2019-04-21
mysql整体会滚_滚mysql 2019-04-21
向mysql数据库中添加批量数据类型_使用JDBC在MySQL数据库中快速批量插入数据 2019-04-21
最全的mysql 5.7.13_最全的mysql 5.7.13 安装配置方法图文教程(linux) 强烈推荐! 2019-04-21
mssql连接mysql数据库文件_在本地 怎么远程连接MSSQL数据库 2019-04-21