熱點帳戶問題和經常使用解決方案【上】

熱點帳戶問題由來已久,一直是帳戶系統設計中的一個難點和瓶頸!
小拽將經過上中下三篇文章,分別介紹下熱點帳戶的產生,解決方案和延伸應用!
本篇主要介紹下什麼是熱點帳戶?通用財務帳戶系統如何設計?以及其中的冪等健和鏈式設計等

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,保證一條帳務流水只能被抵銷一次!

具體三張表詳細字段,須要脫敏,就不貼了,參考上面,其中索引,字段大小,聯合索引等設計根據自身業務場景兼容便可!

小結:欲知後事如何,且聽下回分解

本部分簡單介紹了什麼是熱點帳戶和帳戶的基本設計,涵蓋冪等健設計,鏈式設計等等!
下一篇重點分析下熱點帳戶在鏈式設計下的問題,產生緣由和八種基本解決方案

【轉載請註明:熱點帳戶問題和經常使用解決方案【上】 | 公衆號:靠譜崔小拽 |】

相關文章
相關標籤/搜索