|
最近刚刚生娃,加之工作的事情也不消停,所以文章会更新的少一些,请大家见谅。上次我们谈了热点账户,介绍了使用汇总记账的结算方案来规避日间单账户热点。
今天来看看缓冲记账。
缓冲记账,顾名思义是一种将实时同步的记账行为进行异步化,以达到记账实时性和系统稳定性之间平衡的记账手段,说到底就是削峰填谷。
具体他是怎么做的呢,我们可以举个例子看看。
假设有这么个情况:
支付宝和工行合作推出“实时转账到卡”产品,用户从支付宝端发起转账后可以立即看到账户资金入账。支付宝在工商银行的银行收付账户里有一定的人民币备付金用来用户提现和转账使用。注:此账户用于流出代发时就是标准的热点账户。
工商银行的单账户处理阈值假设为30笔/秒,24小时不间断服务。(日总处理量2592000笔)支付宝为了能够让用户尽快提现到账,要求工商银行开独立的单笔实时银企接口用于资金代发,不使用批量模式。每当用户报送一笔转账或者提现交易,支付宝体内不hold,直接同步调用单笔实时代发接口要求工行处理。(言下之意,这套服务的处理阈值支付宝不理会,有交易就报送)工行在这个代发过程中,不进行日间垫资。支付宝一天在工行的总转账加提现笔数为100万笔,日间峰值可以达到60笔/秒
从上面的条件来看,两家公司合作推出这个产品,就是要让用户感受到秒级的转账体验,支付宝方面不会由于接口并发限制而挂起用户的交易,这个交易都是同步调用同步返回。换言之,用户看到的产品体验是:手机客户端输入转账信息,点击确定,支付宝转几秒菊花,返回转账成功/失败(没有中间业务状态)。
我们可以看到,支付宝全天在工行的代发账户总笔数其实是足够工行业务系统串行消化的,但支付宝的日间峰值却会在某几个瞬间超过工行这套接口的承载能力。
聪明的工行工程师们和产品经理会怎么办呢?
大家想到一个办法,对于日间报送的转账请求,工行只校验账户合法有效性,只要账户一切正常就直接返回转账成功,反之则转账失败。然后在后台做一个队列,把这些成功的交易排个队,以一秒30笔的速度进行处理。
支付宝报送的交易低于30笔/秒的时候,工行系统几乎还是实时地处理了账务变更,而当交易大于30笔/秒的时候,工行就先返回转账结果,把账务处理丢到队列中,等并发量不大的时候慢慢消化,对用户来说感受到的体验还是几秒钟就转账成功了,看上去皆大欢喜。
那么问题来了,这个缓冲记账的方案有些什么短板?
第一个短板,业务量明显过大时缓冲记账可能会带来业务问题
不知道大家是否记得我第一篇文章提到的微信红包?
在我当时抢微信红包的时候发生过一批红包中,部分几个实时入了微信钱包,部分几个在一个多小时候才入账。
假设微信使用的是缓冲记账的方式,那么这种情况是可以解释的。(当然实际上他们也可以使用了部分峰值时段交易事后批量入账的方式;或者我真的是运气不好,他们账务没问题只是内部调单了,一个多小时才恢复……)
我们可以想象,假如账务本身处理能力与实际业务量不在一个量级上,那缓冲记账的延迟会给业务造成一定困扰,比如用户会觉得很奇怪,明明你告诉我转账/红包领取成功了,但为啥我的账户里看不到呢?
上面工行和支付宝的例子里,支付宝只是在某几个高峰时间点需要缓冲记账来削峰填谷,一旦支付宝的日间交易量暴增,导致日间队列根本来不及消化,整个队列越来越长,那就不存在谷可以填,用户肯定会马上发起一连串投诉……
第二个短板,异步化带来的各类异常情况
最明显的就是工行的这个收付户,业务上是不允许日间垫资的,假设支付宝在工行的备付金完全够用的话缓冲记账自然还好说。一旦支付宝报送代发交易的时候并发量很大,工行都返回处理成功了,真扣钱时发现余额不足傻眼了……咋办?
另外还有极端情况:用户的卡在发起转账时还是正常状态,1秒后被注销了,由于缓冲记账了所以当时告知用户转账成功,实际执行记账时失败了。
以上两个问题决定了单纯的缓冲记账无法成为解决热点账户问题的银弹。但缓冲记账在某些特定场景还是带来了很大的价值,不能全盘否定。牺牲记账的时效性换取峰值时的稳定性,在很多场景依然有用。
tips:很多同学会说,既然缓冲记账额外还带来那么多麻烦,那带来价值太低了,何必要使用呢?
实际上,你现在所使用的PC,手机都在使用着“缓冲记账"类似的思想在解决问题。虽然你可能不信,但一颗cpu同时只能做一件事。你在终端向它输出的各种要求,其实他在某一个足够小的时刻维度里,都只在执行一件事——但它和它的小伙伴在能力范围内全部受理了你的指令,不停地中断手头的事情去满足你的要求。这种中断+继续的过程人类根本感知不到。当你的要求太多以至于他根本无法及时处理时,你就会感觉到”玩游戏有点卡“,当卡到一定程度后这种体验就不再被你接受,而你要做的就是换一个更强大的电脑来处理你的需求——而他的运行机制本身和那台前任是一摸一样的。
回到话题本身来,希望大家明白一个道理:
我们不光要关心缓冲记账是如何做的,更应该关心的是他可以运用在哪些场景,哪些领域。从而扬长避短,满足需求。
最后再留个小问题:
很多同学会问,在转账业务中,出款方支付宝账户有热点很正常,但收款方用户银行卡却肯定不是热点账户啊。为啥不能先把用户的账记了,再缓冲记热点账户的账呢?如果能这么做,要怎么做?如果不能这么做,理由呢? |
|