1、熱點(diǎn)賬戶 支付寶技術(shù)

概要:1.匯總明細(xì)記賬(透支)、2.緩沖入賬(透支)、3.子賬戶拆分(麻煩)、4.緩存實(shí)時(shí)記賬,異步入庫(kù)(金額混亂并發(fā))

ps:注意本文是內(nèi)部賬戶,和上一篇墊付無(wú)關(guān)

賬戶沖扣要滿足:更新賬戶余額。明細(xì)表中更新前后余額,操作金額

為什么做熱點(diǎn)賬戶設(shè)計(jì)?

記賬過(guò)程兩部分:記賬憑證,更新賬戶余額。處理時(shí),鎖賬戶,產(chǎn)生性能瓶頸。下面是解決方案

一、匯總明細(xì)記賬

定時(shí)(如半個(gè)小時(shí))將賬務(wù)明細(xì)sum出總金額,入到指定賬戶。不能實(shí)時(shí)入賬,有透支地風(fēng)險(xiǎn)

二、緩沖入賬

將同步記賬請(qǐng)求異步,削峰填谷。賬務(wù)系統(tǒng)閾值100筆/s,24小時(shí)不間斷(一天86400000筆)。高峰期,200筆/s。先返回結(jié)果,丟隊(duì)列中,并發(fā)不大時(shí)慢慢消化。

缺點(diǎn):扛不住暴增,有透支風(fēng)險(xiǎn)

三、子賬戶拆分

創(chuàng)建 與熱點(diǎn)賬戶對(duì)應(yīng)的結(jié)構(gòu)相同 多個(gè)影子賬戶,設(shè)置為隱藏,余額分散至各個(gè)影子賬戶。

請(qǐng)求hash分配(具體hash函數(shù)會(huì)有更多方案)選影子賬戶記賬,分散了賬務(wù)熱點(diǎn)。

缺點(diǎn):子賬戶余額不足,但總余額夠,影響成功率。

四、緩存實(shí)時(shí)記賬,異步入庫(kù)

redis做數(shù)據(jù)前置處理:db熱點(diǎn)賬戶金額同步redis,流水定時(shí)刷到業(yè)務(wù)表。緩存衍生金額混亂并發(fā)問(wèn)題:

redis初始金額100,1)線程1減60,余額40,記錄流水表等待異步入賬。 2)線程2減60時(shí),余額-20必須反向操作。?3)線程2還沒(méi)反向操作時(shí),線程3充值-20+100=80

五、實(shí)際操作(1匯總記賬? 和? 4緩存入賬)

1、設(shè)計(jì)前提:不允許金額錯(cuò)誤

1)不允許多扣,少扣。2)準(zhǔn)確記錄流水表中期初余額,期末余額,操作金額等情況

2、步驟

1)新增?延遲入賬【流水表,入/出賬數(shù)據(jù)先入【流水表】,定時(shí)任務(wù)將【流水表】入賬和出賬數(shù)據(jù)同步 賬戶和賬戶明細(xì)表 ,并且負(fù)責(zé)入賬數(shù)據(jù)?緩存同步

2)新增redis?SortedSet(有序集合)key為【hotspot_account】緩存操作記錄:score為當(dāng)前賬戶操作時(shí)間【新蓋舊】,member賬戶ID

3)新增redis?SortedSet(有序集合)?key為hotspot_account_currentbalance? 緩存余額。score當(dāng)前賬戶可用余額新操作前要將db數(shù)據(jù)同步到hotspot_account_currentbalance中。member賬戶ID

1

(1)當(dāng)賬戶金額充值新增時(shí):

1:記錄redis操作記錄【hotspot_account】:紅色部分,當(dāng)賬戶110000056666660010入賬時(shí),插入或更新數(shù)據(jù),member=110000056666660010,score為當(dāng)前時(shí)間戳(秒)。

????ps:操作指令【ZINCRBY key increment member】,當(dāng)key不存在,或member不是 key 的成員時(shí), ZINCRBY key increment member 等同于 ZADD key increment member 。

2:新增【流水表】,設(shè)置入賬狀態(tài)為未入賬

(2)當(dāng)賬戶金額扣減時(shí):

1:同金額充值,先記錄redis操作記錄【hotspot_account】

2:直接對(duì)緩存hotspot_account_currentbalance對(duì)應(yīng)的金額進(jìn)行扣減

? ??1)扣完>0成功,計(jì)入流水表(未入賬)

3:定時(shí)任務(wù):流水表數(shù)據(jù)更新賬戶表 流水明細(xì)表,設(shè)置流水表數(shù)據(jù)已入賬,同時(shí)將新入賬數(shù)據(jù)流水到更新hotspot_account_currentbalance中可用賬戶余額,讓扣減操作繼續(xù)。以下操作流程:

極端情況:超扣,定時(shí)任務(wù)發(fā)現(xiàn)當(dāng)前緩存余額<0,會(huì)再?gòu)牧魉?b>表 重查db數(shù)據(jù)入賬,部分線程沒(méi)入賬到db,就是說(shuō)線程1扣redis成功,但沒(méi)insert到流水表,這時(shí)線程2扣redis為負(fù),定時(shí)任務(wù)發(fā)現(xiàn)。

解法:不該直接同步余額,應(yīng)加鎖扣,但加鎖復(fù)雜性,采用簡(jiǎn)單的辦法,扣減redis和mysql都瞬時(shí),直接sleep 5 s即可,足夠發(fā)生full gc等其他耗時(shí)

5.升級(jí)服務(wù)硬件,對(duì)CPU內(nèi)存等進(jìn)行升級(jí)

總結(jié):幾種方案的對(duì)比

1:匯總明細(xì)入賬:實(shí)際業(yè)務(wù)是【頻繁出賬,低頻入賬】,不可取。

2:緩沖入賬:需動(dòng)態(tài)判斷流量低峰高峰,維護(hù)請(qǐng)求隊(duì)列,有賬戶透支地風(fēng)險(xiǎn),異步請(qǐng)求中結(jié)果不可控。

3:子賬戶拆分:可能影響成功率,子賬戶扣款和入賬要做到金額相對(duì)平均比較復(fù)雜。

4:內(nèi)存數(shù)據(jù)庫(kù)實(shí)時(shí)地處理記賬,異步入庫(kù)? ok

5:增加硬件處理能力CPU.內(nèi)存:備選方案,無(wú)法從根本上解決

http://www.itdecent.cn/p/47bf0857342e

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

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容