无日切,动账更新的7X24小时的账务系统设计

7X24服务,国外常称为24X7,是不间断服务的别称。由于金融系统的特殊性,经常需要对某日切(日期切换的简称)点的数据进行批量处理或者分析,而客户的金融需求随时都会有,业务时时刻刻都在发生,所以7X24服务对金融企业尤其重要。7X24的概念最初由国外软件服务商介绍引入,国内银行业基本全面实现7*24服务。但在国内互联网金融领域仍未普及。
实现不间断的金融服务,基本思想就是一个字段不可能承载两份数据,所以要用多个字段去存储数据,一份存储实时数据,一份存日切点数据。7X24服务基本有两套主流方式——双余额法(单表双余额法)和影子账户法(双表单余额法)。比较这两种方式,双余额法逻辑稍复杂,但是操作简单,对业务的影响及资源占用低。影子账户法虽逻辑简单一些但是,需要追账等复杂操作,且在原占用多,对业务也有影响(需要追账的业务过多会影响日夜模式切换,部分业务受限)。综合比较之下双余额法是目前实现7X24服务的最优方法。
双余额法的一般原理是账户(双余额法不是专用与账务系统,这里账户不专指分户账,有需求的业务账户也可以使用)中设置余额,上期余额,最终交易日期三个字段。

账号 上期余额 余额 最终交易日期
account_no last_balance balance latest_trans_date

在获取账户余额时,比较最终更新日期与当前日期,当前日期>=更新日期,则取余额,否则取上期余额。
在更新账户余额时,比较最终更新日期与当前日期。当前日期<更新日期(后详),则更新上期余额和余额。当前日期=更新日期,则更新余额。当前日期>更新日期,则设置上期余额=余额再更新余额,最后设置更新日期=当前日期。
由上可见,在双余额的条件下不太关心系统什么时候日切,只要按照交易系统传入的当前日期与更新日期做比较即可。
对更新余额的情况分两种–动账更新和批量更新。
动账更新时在每个账户需要进行账务处理时才更新账户余额,批量更新是每天日切之后对交易日期为昨日的账户统一更余额。动账更新的方式对系统资源占用更少但是对依赖于余额数据的批量来说会相对复杂,批量新会做大量无意义的处理,并且在日切后处理也无法完全保证账户持续可用(更新时要锁定虽然时间可能很短),但是对有依赖于余额数据的其他批量来说会更简单。FinTx开源的账务系统中选择了动账更新的方式,并且对余额获取提供方式提供了封装好的函数供全局调用。
当然账务系统由于其特定的领域特征,7X24的实现更复杂一些,但是原理相同。

账号 上期余额 上期借发生额 上期贷发生额
account_no last_balance last_dr_trans_amt last_cr_trans_amt
余额 借发生额 贷发生额 最终交易日期
balance dr_trans_amt cr_trans_amt latest_trans_date

这里也是一个简化模型引入了借贷发生额有时间再详细写,完整实现请先参考FinTx的开源账务系统。fintx-accounting

补充一份关于7X24服务实现的文档银行核心系统7x24方案参考,来源于网络,如有侵权请联系。
欢迎在GitHub上关注FinTx的开源账务系统:fintx-accounting

fintxorg wechat
欢迎您扫一扫上面的微信公众号订阅!