热点账户问题和常用解决方案【上】

热点账户问题由来已久,一直是账户系统设计中的一个难点和瓶颈!小拽将通过上中下三篇文章,分别介绍下热点账户的产生,解决方案和延伸应用!本篇主要介绍下什么是热点账户?通用财务账户系统如何设计?以及其中的幂等健和链式设计等一、热点账户问题1.1 什么是热点账户热点账户:顾名思义,热点账户就是会被高频操作的账户!相较于普通的账户,热点账户数量不多,但操作频率极高!热点账户从产生来源可分两大类:富二代型:从产生之初就是热点账户,非常稳定。例如财务中公司的账户,每一笔资金操作都要经过公司出金账户,自然而然操作就会灰常频繁,此类账户还包括:大V账户,大KA账户等等,此类账户所引起的问题是本文重点要解决的暴发户型:本身是普通账户,由于热点问题变为热点帐户。例如微博出轨女猪脚账户,诺贝尔奖获得者等等,由于热点事件造成的短时间内访问暴增!此类热点账户防不胜防,超出本文的攻击范围,暂不讨论。1.2 热点账户问题热点账户一旦产生便伴随着高并发,流量分布不均匀,高一致性等等问题。在实际场景中是热点账户必然存在,常常成为用户系统的瓶颈!同时,热点账户问题也是高并发问题的延展,由于热点的不规则性,如何在高并发情况下,削峰填谷,弹性抗压也是很有挑战性的一个方向!1.3 热点账户通用解决方案的价值热点账户除了是账户体系的一个通用问题,在高并发,流量分布不均匀,异常峰值等其他问题上,也有一定的通用性。例如微博热点问题,支付宝双11弹性变更,高频抢购问题等等。期望通过学习热点账户的八种解决方案,能够举一反三,应用于不同场景!二、如何设计一个财务账户在解决热点账户问题之前,先来看下如何设计一个简单的财务账户,来保障资金记账的安全!2.1 业务场景分析从业务上看,财务账户需要准确记录用户的资金变动过程和结果!因此设计一个简单财务账户至少要能包括两个部分:账户余额和账户流水便于理解,来张传统的账本,看下什么是流水,什么是余额账户流水:账户流水也就是通俗意义上的帐或者账单!针对某个账户,每一笔资金的变更都需要记录下来,并且保障准确,不可更改!同时如图所示,流水中需要包含单据产生的原因,来源,变更额等等账户余额:账户余额记录用户某个场景账户的当前资金额度!在复杂的业务场景中往往需要拆分出不同的子账户和账户模型。例如,未结算子账户,可提现子账户,冻结子账户,授信账户等等。从业务场景上一个账户系统核心需要准确记录余额和流水,同时,必须保障记录的准确,完备,不可变更!2.2 技术层面拆解2.2.1 基本表方案通过业务场景初步分析,基本的账户系统,需要三张基本表账户基本信息:账户信息表子账户余额信息:账户余额表账户流水信息:账户流水表三张表基本关系账户信息表 1:N 账户余额表账户余额表 1:N 账户流水表## 具体账户和用户的关联可以参考三户模型 2.2.2 表字段设计从技术层面看,设计具体表细节关键要解决以下几个问题防重:幂等健设计防改:链式设计防错:销账设计先上结果,简单的,能够满足上述需求的设计可以参考innodb mvcc,核心表字段如下2.2.3 表字段解读2.2.3.1 幂等健设计通过三个属性资金凭证号+版本号+rollback三个字段作为uniq key来保证幂等!资金凭证号:来自业务方,业务方发起资金操作的唯一财务凭证,必须可追溯上游凭证和对账!版本号:每次获取DB最新流水n后,版本号n+1插入,保障在并发情况下,每个子账户只有唯一一个版本号:n+1条记录能够插入成功!rollback:回滚标识,保证每条记录能且只能销账一次!对于幂等建设计此处有三条小技巧上游产生:每一个幂等健如果可能的话,尽可能的上游产生,这样可以最大限度的避免自产生幂等健的重复问题。如果确实不能上游产生,例如订单ID,提现单ID,那么也尽可能的分阶段产生,例如提现时,先生成提现单ID,真正提现操作的时候,一定是带着提现单ID和信息来的,防止重复造成资损!业务关联:幂等健的产生可以用ice生成,但是,最好能够和业务关联,因为通过业务强关联的幂等健可以无限回溯来容灾!比如,a用户的b订单进行c操作,uniq_key = a_b_c的话,也就是在任何情况下,无论多少次回溯,重试也只会有一个唯一的a_b_c,而ice生成则可能造成自回溯的时候插入多条!写库保证:这条原则是高一致高并发的基本原则!因为读取a,校验a,然后插入,必然会存在读写之间a变了,或者主从延时a已经变了,读了历史a。因此,幂等一定要通过写库保证或者最底层保证2.2.3.2 链式设计链式设计是保证操作精准不可篡改的非常有效手段!通过资金的before info,after info,版本号三个要素来保证一条资金记录一旦插入成功,前后置信息固化!链式设计的情况下单条修改是不可能的,多条修改需要在保证条目不变的情况下重组资金,但是,整体资金不可变解决多条修改的一般方案:分布式存储,选举来判定最终正确的链,来确认是否某条链发生了过程修改,这种设计有一个很时髦的名字:区块链!而每条流水的核心信息加密后也有了一个更加时髦的名字:比特币!2.2.3.3 销账设计销账设计在账户系统中是一直存在的,现实财务系统可以红销蓝抵,线上财务系统加了链式之后,基本上就只能采用蓝抵通过增加rollback字段,并且严格限制0|1,保证一条账务流水只能被抵销一次!具体三张表详细字段,需要脱敏,就不贴了,参考上面,其中索引,字段大小,联合索引等设计根据自身业务场景兼容即可!小结:欲知后事如何,且听下回分解本部分简单介绍了什么是热点账户和账户的基本设计,涵盖幂等健设计,链式设计等等!下一篇重点分析下热点账户在链式设计下的问题,产生原因和八种基本解决方案【转载请注明:热点账户问题和常用解决方案【上】 | 公众号:靠谱崔小拽 |】

February 13, 2019 · 1 min · jiezi

财务系统设计【序】

新年伊始,组织团队小伙伴进行了一次头脑风暴,畅想了下财务系统2019的愿景,自己也思考颇多,决定针对【财务系统设计】做个专栏,落笔为记!一、一次头脑风暴头脑风暴前,除了准备泡面,花生,矿泉水,还列了几个比较现实的问题公司:你做的事情,值多少钱?公司凭什么给你升职,涨薪?财务系统到底还能给公司带来多少收益?自己:为什么要留下来?干一年财务系统,到底能给每个人带来多大成长?目标:下次跳槽时,你希望自己成长成什么样子?落地:规划每个人的模块方向,如何把自身成长需求和业务成长绑票?与我个人而言,期望通过这次头脑风暴,让团队小伙伴们能够对自己的模块有个规划,能够在业务成长的过程中实现个人技能成长,能够通过促进模块收益来提升自己薪资职级!无他,也希望各位看官能够思考一下二、财务系统设计专栏头脑风暴后,小拽也一直在思考,2018年干了一年财务系统了,2019年如何搞?具体的需求拆解,模块设计,架构图,暂时先不祭出来了,毕竟还需要深入的拆解和剖析!但结合年初的flag,小拽决定2019年完善【财务系统设计】专栏^^,期望能够通过专栏,自己能够体系化的梳理下财务系统,抽象出更通用的解决方案!废话不提先列下2018年亏欠的文章和目录,今年一定补上^^!热点账户问题思考和常用解决方案数据最终一致性保证幂等健设计原则全局ID生成思考和解决方案财务系统异步和同步的思考国际化账务系统思考财务数仓有哪些坑?通用账单分级模型设计账户模型设计和思考账户流水设计和思考三、专栏目录长远的看,小拽的财务模块设计最终会把所有文章落到各个模块中,暂时先梳理了下目录!财务系统专栏├── 在线系统设计和实现│ ├── 分账模块│ ├── 提现模块│ ├── 收银模块│ ├── 结算模块│ ├── 记账模块│ └── 账户模块├── 支撑系统设计和实现│ ├── MIS系统│ ├── openAPI│ ├── 任务系统│ ├── 财务网关│ ├── 数据质量中心│ └── 监控预警系统├── 数据中心设计和实现│ ├── ARCHIVE│ ├── GraphDB│ ├── HBASE│ ├── HIVE│ ├── KV│ ├── RDS│ └── TSDB└── 离线系统设计和实现 ├── 对账引擎 ├── 经营分析 ├── 结算引擎 ├── 财务报表 ├── 资金安全 └── 预算引擎【转载请注明:财务系统设计【序】 | 靠谱崔小拽 】

January 6, 2019 · 1 min · jiezi