热点帐户问题由来已久,一直是帐户系统设计中的一个难点和瓶颈!
小拽将经过上中下三篇文章,分别介绍下热点帐户的产生,解决方案和延伸应用!
本篇主要介绍下什么是热点帐户?通用财务帐户系统如何设计?以及其中的幂等健和链式设计等
热点帐户:顾名思义,热点帐户就是会被高频操做的帐户!相较于普通的帐户,热点帐户数量很少,但操做频率极高!安全
热点帐户从产生来源可分两大类:并发
热点帐户一旦产生便伴随着高并发,流量分布不均匀,高一致性等等问题。在实际场景中是热点帐户必然存在,经常成为用户系统的瓶颈!
同时,热点帐户问题也是高并发问题的延展,因为热点的不规则性,如何在高并发状况下,削峰填谷,弹性抗压也是颇有挑战性的一个方向!mvc
热点帐户除了是帐户体系的一个通用问题,在高并发,流量分布不均匀,异常峰值等其余问题上,也有必定的通用性。例如微博热点问题,支付宝双11弹性变动,高频抢购问题等等。指望经过学习热点帐户的八种解决方案,可以触类旁通,应用于不一样场景!分布式
在解决热点帐户问题以前,先来看下如何设计一个简单的财务帐户,来保障资金记帐的安全!高并发
从业务上看,财务帐户须要准确记录用户的资金变更过程和结果!所以设计一个简单财务帐户至少要能包括两个部分:帐户余额和帐户流水学习
帐户流水:帐户流水也就是通俗意义上的账或者帐单!针对某个帐户,每一笔资金的变动都须要记录下来,而且保障准确,不可更改!同时如图所示,流水中须要包含单据产生的缘由,来源,变动额等等ui
帐户余额:帐户余额记录用户某个场景帐户的当前资金额度!在复杂的业务场景中每每须要拆分出不一样的子帐户和帐户模型。例如,未结算子帐户,可提现子帐户,冻结子帐户,授信帐户等等。加密
从业务场景上一个帐户系统核心须要准确记录余额和流水,同时,必须保障记录的准确,完备,不可变动!spa
经过业务场景初步分析,基本的帐户系统,须要三张基本表
帐户基本信息:帐户信息表 子帐户余额信息:帐户余额表 帐户流水信息:帐户流水表 三张表基本关系 帐户信息表 1:N 帐户余额表 帐户余额表 1:N 帐户流水表 ## 具体帐户和用户的关联能够参考三户模型
从技术层面看,设计具体表细节关键要解决如下几个问题
先上结果,简单的,可以知足上述需求的设计能够参考innodb mvcc,核心表字段以下
经过三个属性资金凭证号+版本号+rollback三个字段做为uniq key来保证幂等!
资金凭证号:来自业务方,业务方发起资金操做的惟一财务凭证,必须可追溯上游凭证和对帐!
版本号:每次获取DB最新流水n后,版本号n+1插入,保障在并发状况下,每一个子帐户只有惟一一个版本号:n+1条记录可以插入成功!
rollback:回滚标识,保证每条记录能且只能销帐一次!
对于幂等建设计此处有三条小技巧
链式设计是保证操做精准不可篡改的很是有效手段!
经过资金的before info,after info,版本号三个要素来保证一条资金记录一旦插入成功,先后置信息固化!
链式设计的状况下单条修改是不可能的,多条修改须要在保证条目不变的状况下重组资金,可是,总体资金不可变
解决多条修改的通常方案:分布式存储,选举来断定最终正确的链,来确认是否某条链发生了过程修改,这种设计有一个很时髦的名字:区块链!而每条流水的核心信息加密后也有了一个更加时髦的名字:比特币!
销帐设计在帐户系统中是一直存在的,现实财务系统能够红销蓝抵,线上财务系统加了链式以后,基本上就只能采用蓝抵
经过增长rollback字段,而且严格限制0|1,保证一条帐务流水只能被抵销一次!
具体三张表详细字段,须要脱敏,就不贴了,参考上面,其中索引,字段大小,联合索引等设计根据自身业务场景兼容便可!
本部分简单介绍了什么是热点帐户和帐户的基本设计,涵盖幂等健设计,链式设计等等!
下一篇重点分析下热点帐户在链式设计下的问题,产生缘由和八种基本解决方案
【转载请注明:热点帐户问题和经常使用解决方案【上】 | 公众号:靠谱崔小拽 |】