首页 > 其他分享 >对账业务系统实践

对账业务系统实践

时间:2022-10-09 11:36:40浏览次数:85  
标签:方案 ftp 业务 实践 问题 对账 数据 结账


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

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

  对于这篇文章,还是很精彩的,我先贴一下原文地址:​​https://zhuanlan.zhihu.com/p/27523606​

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

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

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

 

# #  对账都有哪些问题

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

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

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

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

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

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

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

问题序号

问题描述

是否解决

是否给出实现细节

备注信息

第一个问题

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

 

 

 

第二个问题

财务的基本概念,这一块我们要有基本的理解

 

 

 

第三个问题

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

 

 

 

第四个问题

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

 

 

 

第五个问题

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

 

 

 

第六个问题

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

 

 

 

 第七个问题

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

 

 

 

 

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

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

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

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

  对账系统整体处理:

对账业务系统实践_安全问题

 

# # 财务的基本概念

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。

 

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

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

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

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

 

# # 一定要考虑安全问题

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

标签:方案,ftp,业务,实践,问题,对账,数据,结账
From: https://blog.51cto.com/u_15812686/5739963

相关文章

  • 数据填报平台能满足什么样的业务场景?_光点科技
    无论你在哪个国家,无论你做什么,你每天都会处理各种信息和数据收集。我们收集数据的形式也在发生变化,比如注册和统计,这以一种奇妙的方式改变了我们的生活。1.校园学生信息收集......
  • 网络字节序与主机字节序的转换函数实践
    .什么是字节序字节序是处理器架构特性,用于指示像整数这样的大数据类型内部的字节如何排序。简单来说,就是指超过一个字节的数据类型在内存中的存储的顺序。那么很明显,像char......
  • 网络字节序与主机字节序的转换函数实践
    主机字节序 在不同的CPU处理器下,有不同的字节序类型,而字节序是指整数在内存中存储的顺序叫做主机序。最常见的主机序有两种:大端存储(Bigendian):最高有效位存于最低内存地......
  • 网络字节序与主机字节序的转换函数实践
    在Linux网络编程中,经常碰到网络字节序与主机字节序的相互转换。说到网络字节序与主机字节序需要清晰了解以下几个概念。字节序,顾名思义,指字节在内存中存储的顺序。比如一......
  • IT硬件故障的主要原因和预防的最佳实践
    IT运维中常见的硬件问题,如设备过热或服务器过载,即使是很短的时间,也可能导致企业的巨大的损失和客户流失。据Dynamic研究发现:企业组织面临的超过45%的网络中断完全是由......
  • 设计模式在美团外卖营销业务中的实践
     业务策略多变导致需求多变,是业界很多技术团队面临的最具挑战的问题之一。那么如何设计一套易于扩展和维护的营销系统呢?  今天的文章来自美团外卖营销技术团队,他们分享......
  • 实验5:开源控制器实践——POX
    实验5:开源控制器实践——POX(一)基本要求验证Hub模块h1pingh2h1pingh3验证Switch模块h1pingh2h1pingh3L2_learning模块流程图(二)进阶要求1.重新搭建(一......
  • 实验4:开源控制器实践——OpenDaylight
    基本要求利用Mininet平台搭建下图所示网络拓扑,并连接OpenDaylight控制器通过Postman工具调用OpenDaylight提供的API下发流表,实现拓扑内主机h1和h3网络中断10s进阶要......
  • 实验5:开源控制器实践——POX
    实验5:开源控制器实践——POX一、实验目的能够理解POX控制器的工作原理;通过验证POX的forwarding.hub和forwarding.l2_learning模块,初步掌握POX控制器的使用方法;......
  • 实验5:开源控制器实践——POX
    实验5:开源控制器实践——POX一、实验目的能够理解POX控制器的工作原理;通过验证POX的forwarding.hub和forwarding.l2_learning模块,初步掌握POX控制器的使用方法;能够......