资金归集及联动支付实现设计
一、现金管理业务介绍
现金管理业务是以集团客户为对象、以客户服务为中心,以多种产品组合为内容、以账户管理为核心、以方便客户资金流动性管理为目的的银行综合产品和服务。【1】其中最具代表性的业务就是将客户总分公司/母子公司的账户维护成一个树状关系,并根据客户指令,在这些账户之间进行资金归集及联动支付,最大限度满足客户资金流动性需求。下图显示了一个总公司、省分公司、地分公司、县分公司的4级账户结构树,用箭头标记了账户间资金上划和下拨关系,对应收支两条线。
现金管理签约账户结构举例初看起来,相比于普通的银行对公业务,现金管理业务复杂性在于账户间资金调拨关系的维护和处理,仅是一种业务操作复杂性,实际上,资金归集及联动支付在一次处理中往往涉及资金调拨路径上的多个账户,并且由于同时操作的不同路径上共有上级账户、顶点账户的存在,很容易出现性能瓶颈,本文主要讨论解决该问题,以实现高性能的现金管理,从技术上满足大型客户的资金并发处理需求。
二、资金归集说明及实现
资金归集是指银行根据客户提供的集团内账户间的资金归集关系,实时地将下级账户的资金全部转往上级账户。以上图为例,X1账户收款100元时,需要实时将100元归集到D1账户,依次类推,直到Z账户。
技术实现上,起初的方式是在一个事务中完成上述归集处理,对应上面的例子,将X1向D1转账100元、D1向S1转账100元、S1向Z转账100元共3个业务处理封装成一个事务,这种方式当然可以满足业务功能,但出于本文前述的原因,当业务并发度较高后,由于上级热点账户的存在,交易成功率将明显下降。
为服务大型集团客户,达到较高的资金归集能力,目前通行的方案是借助消息队列,进行异步化处理,准实时完成资金归集。回到上面的例子,X1账户收款100元时,完成自身过账处理,并向消息队列插入一条向D1账户入账100元的消息,D1、S1做同样的处理,最后完成归集资金到Z账户。这种方式实现了上下级账户之间处理的解耦,能够支持资金归集高并发处理。
三、联动支付说明及实现
联动支付是指下级账户需要对外支付时,如果余额不足,银行根据客户提供的集团内账户间的资金下拨关系,实时从上级账户将资金下拨给下级账户,并由下级账户完成支付。同样以上图为例,X4账户对外付款400元时,因自身余额不足,需要实时下拨D3账户的余额,如果加上D3账户余额仍不足,需要继续请求上一级账户下拨,直到Z账户。
技术实现上,目前可行的方式也是在一个事务中完成联动支付,在上面的例子中,假设X4、D3、S2各留存100元,X4付款400元时,实时请求D3下拨300元,D3收到请求,实时请求S2下拨200元,S2收到请求,实时请求Z下拨100元,如果Z账户余额此时小于100元,则交易失败,否则Z账户实时向S2账户转账100元,S2收到应答后向D3转账200元,D3随后向X4转装300元,X4收到300元后完成400元对外付款。显而易见,该方式无法支撑较高的处理并发度。由于付款交易,为避免资金风险,也无法先支付后下拨资金,资金归集采用的异步处理方案在该场景下无法使用。
在实际生产上,联动支付也暂无好的技术实现方式,通常是从业务上进行优化,如:压缩客户联动支付账户签约层级;仅允许叶子节点账户对外支付且预设账户支付额度,额度内可先支付后平账;手工下拨资金后支出;等等,一般需要同客户协商采用。
四、联动支付技术优化方案
本文尝试提出一种技术优化方案。
前置条件:除总公司账户外,支付路径上及叶子节点账户余额原则上保持为0。处理过程:账户支出时,判断账户自身支出额度、自身余额加总公司账户余额是否足够,如果足够,可以先完成账户支出处理,异步完成资金下拨过程。辅助过程:设置定时任务或者日终任务,将除总公司账户外账户的余额归集到总公司,同时按控制周期重置各账户支付额度。
该方案对联动支付业务规则也有一定的改变:一是账户的支付仅受自身支付额度的控制,不再受上级节点额度的控制;结合上文图中例子说明,X4对外支付时,只要自身支付额度足够,就可以支付,不受支付路径上D3、S2额度的影响,这对业务上额度设置提出了更高要求。二是要求各账户不再留存余额,由总公司账户统一调拨,一些情况下如跨行支付资金被退回到原账户,需要资金归集处理。该方案的并发处理能力主要受总公司账户处理的限制,必要时可以拆分,设置多个总公司账户及支付账户结构树。
五、其他说明
资金归集和联动支付时,现金管理业务还需要考虑账户自身的支付控制条件,本文篇幅所限没有涉及,实际实现时需要考虑;仍有客户在财务上没有达成“收支两条线”,实现时也需要注意这种情况。
参考文献
【1】现金管理业务介绍,https://www.abchina.com/cn/branch/qh/marketing/201202/t20120228_210147.htm