再讲解如何设计复杂多变的清分系统之前 先看下咱们整体架构清分
我们接入服务是两台服务器,一个缓存服务器,共享目录设置在接入服务服务器其中之一,一天缓存服务器,oracle数据库主备库 这是目前大致情况,由于清分服务 主要是内部人员使用,使用人数不多,对高并发要求不高,主要用于清算,所以系统必须稳定
问题一 为何设置主备库
因为私网对账清分有很多统计服务 主要以查询为主,一般查询使用备库,减少压力,而对账清分使用主库,目前 改架构情况是对账清分5亿,100万笔左右 对账时间10分分钟左右,清分时间10分钟左右
问题二 对账清分服务为何只使用单台服务器
由于历史原因,首先私网搭设时部分银行不容许使用一些中间件(后面专门会写一节模拟redis分布式锁的文章) 而多台服务器对账清分必然需要使用分布式锁,另外 清分服务需要调用银行服务 有些银行服务可能无法支持这种并发调用,基于这些考虑对账清分私网采用的单台服务器,而查询服务ng分压到另一台服务器上,总之私网对账清分主要是计算金额要对,对账数据要稳,质量要高。
私网对账和公网对账流程上差不多,具体可以参考前面章节,而清分到底干了些什么,为何复杂多变呢?
其实清分就是根据商户出款,机构的费率设置,算各级分润差,对接银行接口 就这么简单(具体业务可以参考前面章节)具体大致流程如下
费率差计算:不同的机构费率差设计不一样
商户打款:商户打款不是简单的第三方账单的出款金额,有商户减免 、商户补贴、 还有各通道方的不定期打折政策 比如微信的蓝海行动 支付宝的绿洲活动等
通道手续费:通道有0通道比如针对医院 福利机构 千二 千6通道等
接口对接:接口对接是最复杂的,基本上每对接一次 就需要重新写接口,有传输上sftp ftp socket http 文件格式上有txt xls pdf csv 语言上有java c c++ 加解密算法上有国密算法 rsa算法 des算法 以及内部算法 等等
还有其它各种统计报表差异等等 这里不再一一表述
针对以上各种复杂多变的需求,我们必须需要设计好整个清分流程。目前我们使用的是模板方法模式+策略模式+抽象工程模式
模板模式:将整个清分流程固定好,基础数据+抽象方法+默认实现,如果有定制 重写抽象方法即可
public final 模板{
初始化参数();
abstract开始();
provider.getService(...).计算分润();
provider.getService(...).计算商户出款();
....
abstract结束();
}
其中 abstract是抽象方法 provider是工厂模式
策略模式:每家银行算法逻辑不一样,这里将其算法抽象,有具体需要重写的 可以根据定制
抽象工程模式:每家银行各个环节算法其实根据部署环境 可以打包成一整套算法产品逻辑,这样完全 根据不能的银行 打包成自己独立的一套算法逻辑,最终部署的包就是接口+算法产品簇lib