熱點帳戶問題由來已久,一直是帳戶系統設計中的一個難點和瓶頸!
小拽將經過上中下三篇文章,分別介紹下熱點帳戶的產生,解決方案和延伸應用!
本篇主要介紹下什麼是熱點帳戶?通用財務帳戶系統如何設計?以及其中的冪等健和鏈式設計等
熱點帳戶:顧名思義,熱點帳戶就是會被高頻操做的帳戶!相較於普通的帳戶,熱點帳戶數量很少,但操做頻率極高!安全
熱點帳戶從產生來源可分兩大類:併發
熱點帳戶一旦產生便伴隨着高併發,流量分佈不均勻,高一致性等等問題。在實際場景中是熱點帳戶必然存在,經常成爲用戶系統的瓶頸!
同時,熱點帳戶問題也是高併發問題的延展,因爲熱點的不規則性,如何在高併發狀況下,削峯填谷,彈性抗壓也是頗有挑戰性的一個方向!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,保證一條帳務流水只能被抵銷一次!
具體三張表詳細字段,須要脫敏,就不貼了,參考上面,其中索引,字段大小,聯合索引等設計根據自身業務場景兼容便可!
本部分簡單介紹了什麼是熱點帳戶和帳戶的基本設計,涵蓋冪等健設計,鏈式設計等等!
下一篇重點分析下熱點帳戶在鏈式設計下的問題,產生緣由和八種基本解決方案
【轉載請註明:熱點帳戶問題和經常使用解決方案【上】 | 公衆號:靠譜崔小拽 |】