热点帐户问题和经常使用解决方案【上】

热点帐户问题由来已久,一直是帐户系统设计中的一个难点和瓶颈!
小拽将经过上中下三篇文章,分别介绍下热点帐户的产生,解决方案和延伸应用!
本篇主要介绍下什么是热点帐户?通用财务帐户系统如何设计?以及其中的幂等健和链式设计等

1、热点帐户问题

1.1 什么是热点帐户

热点帐户:顾名思义,热点帐户就是会被高频操做的帐户!相较于普通的帐户,热点帐户数量很少,但操做频率极高!安全

热点帐户从产生来源可分两大类:并发

  • 富二代型:从产生之初就是热点帐户,很是稳定。例如财务中公司的帐户,每一笔资金操做都要通过公司出金帐户,天然而然操做就会灰常频繁,此类帐户还包括:大V帐户大KA帐户等等,此类帐户所引发的问题是本文重点要解决的
  • 暴发户型:自己是普通帐户,因为热点问题变为热点账户。例如微博出轨女猪脚帐户诺贝尔奖得到者等等,因为热点事件形成的短期内访问暴增!此类热点帐户防不胜防,超出本文的攻击范围,暂不讨论。

1.2 热点帐户问题

热点帐户一旦产生便伴随着高并发,流量分布不均匀,高一致性等等问题。在实际场景中是热点帐户必然存在,经常成为用户系统的瓶颈!
同时,热点帐户问题也是高并发问题的延展,因为热点的不规则性,如何在高并发状况下,削峰填谷,弹性抗压也是颇有挑战性的一个方向!mvc

1.3 热点帐户通用解决方案的价值

热点帐户除了是帐户体系的一个通用问题,在高并发,流量分布不均匀,异常峰值等其余问题上,也有必定的通用性。例如微博热点问题,支付宝双11弹性变动,高频抢购问题等等。指望经过学习热点帐户的八种解决方案,可以触类旁通,应用于不一样场景!分布式

2、如何设计一个财务帐户

在解决热点帐户问题以前,先来看下如何设计一个简单的财务帐户,来保障资金记帐的安全!高并发

2.1 业务场景分析

从业务上看,财务帐户须要准确记录用户的资金变更过程和结果!所以设计一个简单财务帐户至少要能包括两个部分:帐户余额帐户流水学习

便于理解,来张传统的帐本,看下什么是流水,什么是余额
finance_hot_account_1区块链

帐户流水:帐户流水也就是通俗意义上的账或者帐单!针对某个帐户,每一笔资金的变动都须要记录下来,而且保障准确,不可更改!同时如图所示,流水中须要包含单据产生的缘由,来源,变动额等等ui

帐户余额:帐户余额记录用户某个场景帐户的当前资金额度!在复杂的业务场景中每每须要拆分出不一样的子帐户和帐户模型。例如,未结算子帐户,可提现子帐户,冻结子帐户,授信帐户等等。加密

从业务场景上一个帐户系统核心须要准确记录余额和流水,同时,必须保障记录的准确,完备,不可变动!spa

2.2 技术层面拆解

2.2.1 基本表方案

经过业务场景初步分析,基本的帐户系统,须要三张基本表

帐户基本信息:帐户信息表
子帐户余额信息:帐户余额表
帐户流水信息:帐户流水表

三张表基本关系
帐户信息表 1:N 帐户余额表
帐户余额表 1:N 帐户流水表

## 具体帐户和用户的关联能够参考三户模型

2.2.2 表字段设计

从技术层面看,设计具体表细节关键要解决如下几个问题

  1. 防重:幂等健设计
  2. 防改:链式设计
  3. 防错:销帐设计

先上结果,简单的,可以知足上述需求的设计能够参考innodb mvcc,核心表字段以下

finance_hot_account_2

2.2.3 表字段解读

2.2.3.1 幂等健设计

经过三个属性资金凭证号+版本号+rollback三个字段做为uniq key来保证幂等!

资金凭证号:来自业务方,业务方发起资金操做的惟一财务凭证,必须可追溯上游凭证和对帐!
版本号:每次获取DB最新流水n后,版本号n+1插入,保障在并发状况下,每一个子帐户只有惟一一个版本号:n+1条记录可以插入成功!
rollback:回滚标识,保证每条记录能且只能销帐一次

对于幂等建设计此处有三条小技巧

  1. 上游产生:每个幂等健若是可能的话,尽量的上游产生,这样能够最大限度的避免自产生幂等健的重复问题。若是确实不能上游产生,例如订单ID,提现单ID,那么也尽量的分阶段产生,例如提现时,先生成提现单ID,真正提现操做的时候,必定是带着提现单ID和信息来的,防止重复形成资损!
  2. 业务关联:幂等健的产生能够用ice生成,可是,最好可以和业务关联,由于经过业务强关联的幂等健能够无限回溯来容灾!好比,a用户的b订单进行c操做,uniq_key = a_b_c的话,也就是在任何状况下,不管多少次回溯,重试也只会有一个惟一的a_b_c,而ice生成则可能形成自回溯的时候插入多条!
  3. 写库保证:这条原则是高一致高并发的基本原则!由于读取a,校验a,而后插入,必然会存在读写之间a变了,或者主从延时a已经变了,读了历史a。所以,幂等必定要经过写库保证或者最底层保证
2.2.3.2 链式设计

链式设计是保证操做精准不可篡改的很是有效手段!
经过资金的before info,after info,版本号三个要素来保证一条资金记录一旦插入成功,先后置信息固化!

链式设计的状况下单条修改是不可能的,多条修改须要在保证条目不变的状况下重组资金,可是,总体资金不可变

解决多条修改的通常方案:分布式存储,选举来断定最终正确的链,来确认是否某条链发生了过程修改,这种设计有一个很时髦的名字:区块链!而每条流水的核心信息加密后也有了一个更加时髦的名字:比特币

2.2.3.3 销帐设计

销帐设计在帐户系统中是一直存在的,现实财务系统能够红销蓝抵,线上财务系统加了链式以后,基本上就只能采用蓝抵
经过增长rollback字段,而且严格限制0|1,保证一条帐务流水只能被抵销一次!

具体三张表详细字段,须要脱敏,就不贴了,参考上面,其中索引,字段大小,联合索引等设计根据自身业务场景兼容便可!

小结:欲知后事如何,且听下回分解

本部分简单介绍了什么是热点帐户和帐户的基本设计,涵盖幂等健设计,链式设计等等!
下一篇重点分析下热点帐户在链式设计下的问题,产生缘由和八种基本解决方案

【转载请注明:热点帐户问题和经常使用解决方案【上】 | 公众号:靠谱崔小拽 |】

相关文章
相关标签/搜索