架構師方案-熱點賬戶處理

前言

熱點賬戶廣泛存在于大商戶或明星用戶的出入賬、營銷等場景,是行業(yè)普遍存在的技術問題。

image.png

賬戶系統(tǒng)最重要、最基礎的系統(tǒng)工作是記賬,記賬的準確性、及時性和吞吐直接影響著用戶的業(yè)務體驗和資金安全。

一般賬務系統(tǒng)對賬戶的沖扣需要滿足以下3點:

1、更新賬戶表中的賬戶余額。

2、記錄賬戶明細表中的賬戶更新前余額,賬戶更新后余額,操作金額。

3、關聯(lián)記錄單據憑證(引起賬戶變更的業(yè)務因子)方便對賬

其中對賬戶表中的余額更新一般是直接update操作,在高并發(fā)下為了保證賬戶資金安全,我們一般會加鎖處理,但這就會影響賬戶的實時處理?;诖?,本章整理業(yè)界常用方案,給大家提供解決思路。

方案1:限流控制

既然系統(tǒng)支持不了那么多賬戶扣減的人,直接把能承載系統(tǒng)之外的請求,拒絕掉。

image.png

優(yōu)點:
實現(xiàn)簡單,添加限流器。

缺點:
這個是犧牲用戶體驗來保障系統(tǒng)性能,支付或者賬務處理的失敗率會提升。
適用場景:
這種方法可以作為兜底方案,配合其他方案使用,保護數(shù)據庫和系統(tǒng)的安全的措施是不能缺失的。

方案2:預寫日志記賬(WAL方式)

在表中插入新數(shù)據時,INSERT命令的效率通常比UPDATE要高,因為更新時需要進行大量的數(shù)據讀取和寫回操作,而INSERT命令只涉及到簡單的順序寫入操作。

image.png

既然賬戶更新是在數(shù)據底層是一個隨機操作,那就把先用寫入速度更快的插入log操作,然后定時將這些log變?yōu)閷嶋H更新。
這其實是一種WAL(Write Ahead Log)預寫日志思想,是數(shù)據庫和操作系統(tǒng)中常見的一種手段,用于
1、保證數(shù)據操作的原子性和持久性。
2、使得隨機寫變?yōu)轫樞驅懱岣咝阅堋?/p>

優(yōu)點:
實時的交易全部是insert賬務明細,能大大提高入賬速度

缺點:
交易不能實時入賬,其實如果控制好定時匯總入賬的頻度,比如分鐘級,用戶也是可以接受的,賬戶減錢透支地風險。

適用場景:
賬務更新時效性要求高不高,這種方式對收單類業(yè)務(賬戶加錢)非常實用,但是對支出類業(yè)務(賬戶減錢)類來說,有賬戶透支地風險。

方案3: 匯總明細記賬

image.png

既然熱點賬戶瓶頸是余額更新,那我們就降低余額變更頻率,操作方式是把一定時間明細金額匯總,將多次寫變?yōu)橐淮螌懀?/p>

balance =balance+ amout1;
balance =balance+ amout2;
...
balance =balance+ amoutN;
優(yōu)化為
balance =balance+ sum(amout1,amout2,...,amoutN);

優(yōu)點:
一次性寫入賬戶,減少賬戶寫入更新操作

缺點:
交易不能實時入賬,對賬戶加錢場景很實用,但是賬戶扣款類場景會出現(xiàn)賬戶透支問題。

適用場景:
這個方案的適用場景就是不需要實時更新余額,且主要是增加賬戶余額的場景。如B端收單賬戶與業(yè)務中間賬戶處理。

其中,批量入賬需新增一種修改余額的方式,一次更新余額,批量插入賬戶流水。

方案4: 緩沖記賬(異步削峰記賬)

緩沖記賬,將入賬任務放入到消息隊列中異步處理。


image.png

優(yōu)點:
消息隊列具有削峰填谷的功能,讓突發(fā)流量任務讓平緩執(zhí)行,提升系統(tǒng)穩(wěn)定性,可以準實時記賬。

缺點:
非實行性,存在消息堆積以及消息丟失的情況,且存在賬戶減錢出現(xiàn)賬戶透支的問題

適用場景:
適用主要是增加賬戶余額的場景:在B端收單賬戶與業(yè)務中間賬戶處理;在C端微信、頭條等春節(jié)搶紅包入賬處理。但是,高頻扣款時需要考慮余額不足的情況,避免賬戶透支。

方案5: 緩存記賬

利用redis緩存的高性能讀寫優(yōu)勢,和秒殺Redis緩存預扣減庫存類似。

image.png

優(yōu)點:
緩存具有高吞吐量、低延遲的特點。

缺點:
緩存宕機,數(shù)據會有丟失風險,數(shù)據記錄可能沒有

適用場景:
適合那些對賬戶金額不特別敏感的場景。比如,小說網站里根據用戶觀看停留時長給用戶送積分,直接操作數(shù)據庫,會有巨大的訪問壓。所以,先在redis操作,然后定時一次性flush到數(shù)據庫。

方案6: 賬戶拆分

image.png

優(yōu)點:
分散了熱點賬戶寫入量

缺點:
當選擇子賬戶扣款的時候,可能出現(xiàn)扣款不成功的情況,但是總的子賬戶余額是夠的情況,這樣就會影響這筆扣款交易。

適用場景:
只要能保證子賬戶資金歸集扣減無異常,適用于大部分賬戶類的扣款入賬。

方案7: 讀寫分離

通過利用不同節(jié)點分別承載讀取與寫入,還可緩解因為鎖帶來的爭用問題,提高單節(jié)點的訪問效率。


image.png

優(yōu)點:
提高訪問性能、穩(wěn)定性、可用性。

缺點:
同步數(shù)據時,可能存在讀庫和寫入不一致情況,可以通過業(yè)務上優(yōu)化避免。

適用場景:
適用于所有場景,準實時性。

方案8: 其他技術優(yōu)化

8.1. 優(yōu)化數(shù)據庫相關配置

連接池優(yōu)化,CPU、內存優(yōu)化等等

8.2. 替換讀寫效率更高的數(shù)據

例如:
支付寶-高性能帳務數(shù)據庫Maxwell:自主可控、超低延時

參考

陳天宇宙-讓“熱點賬戶”清涼一夏
laoxilaoxi-交易系統(tǒng)熱點賬戶問題
字節(jié)-春節(jié)錢包大流量獎勵系統(tǒng)入賬及展示的設計與實現(xiàn)
百度-交易中臺之錢包系統(tǒng)架構淺析
趣頭條-萬級TPS億級流水-中臺賬戶系統(tǒng)架構設計

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容