支付中的账户体系:(三户模型),客户、账户和用户。
其中客户指的是,自然人、法人,如一般在系统中分为企业用户、个人用户。在信用卡中分为普通卡客户、白金卡客户等等。
账户指的是为客户进行交易活动而开设的虚拟账户,账户一般记录交易产生的记录,即记账。
而用户指的是系统的登录的用户相关信息。比如用户密码、角色、权限等。
热点账户更新就是对账户的更新。
热点账户一般分为加频账户、减频账户以及双频账户。
加频账户:入金比较频繁的账户,比如募集筹款的活动。
减频账户:如给员工发放工资的账户。
双频账户:如电商平台的用户在支付公司的一个资金流。用户在某平台A 下单购物,用户的钱会先收取到平台A的内部账户,再转让给平台A上的卖家基本户,最后卖家再提现到自己的银行账户。这里的平台A的内部账户就是双频账户。
热点账户的问题在于各线程竞争对于账户余额的操作权。核心思路是减少单位时间内对余额的操作。常用的方法有:
1、限流(超出能力范围内的不处理,主要通过拒绝部分请求来实现,一般是在系统压测后得到系统的承载阈值,作为兜底),该方式会影响用户体验。
2、缓冲,就是先将请求放置到可靠的消息队列中,然后给调用者返回,之后从消息队列中取出请求慢慢处理。使用削峰填谷的方式减少单位时间内对同一个账户的操作。也容易造成消息积压。
3、汇总提交,也就是保存每个并发的操作明细,然后由定时任务一次性的汇总更新到数据库并修改明细的状态。比较适合于加频账户,实现起来比较简单,缺点是账户余额更新不及时。一般只针对减频账户。
4、将账户拆成多个影子账户。通过影子账户路由,将不同操作线程路由到不同的影子账户更新。这中方式有很多不足,比如如何平衡多个影子账户的余额不足的问题,可以使用缓存,当请求到来时先更新缓存,减少对影子账户的更新,后面更新到数据库,对账发现缓存和数据库的不一致问题。
热点账户的识别:1、使用缓存计数器;2、通过读取和处理账户日志,使用spark streaming 窗口计算功能分析实时计算窗口账户的操作次数。并上报配置中心,配置中心再下发客户端,客户端主动缓存热点账户的配置,当应用程序执行时,通过热点账户的判断逻辑,执行不同的逻辑。如果被限留则无法统计全部的流量。