數(shù)據(jù)庫(kù)熱點(diǎn)賬戶問(wèn)題

一、熱點(diǎn)賬戶的定義

在銀行或者第三方支付系統(tǒng)的賬務(wù)數(shù)據(jù)庫(kù)的處理中,數(shù)據(jù)從一個(gè)賬戶轉(zhuǎn)出,或者有數(shù)據(jù)轉(zhuǎn)入一個(gè)賬戶,賬戶都會(huì)收到記賬請(qǐng)求,并都有一個(gè)記賬處理的過(guò)程。記賬處理過(guò)程主要包括兩部分,一是記錄記賬憑證,二是更新賬戶的余額。為了保證賬戶不被其他請(qǐng)求影響數(shù)據(jù)的準(zhǔn)確性,在進(jìn)行記賬處理時(shí),會(huì)先對(duì)賬戶的資源加鎖,記賬處理完畢后會(huì)自動(dòng)釋放鎖。隨著賬務(wù)處理業(yè)務(wù)量的增大,賬務(wù)數(shù)據(jù)庫(kù)中的賬戶常常會(huì)在瞬間產(chǎn)生多個(gè)并發(fā)操作,但所有對(duì)應(yīng)的并發(fā)線程中只有一個(gè)線程能夠持有當(dāng)前賬戶的資源鎖,其他線程必須等待該鎖被釋放后再逐一進(jìn)行記賬處理,這樣該賬戶將會(huì)被頻繁加鎖釋鎖,使該賬戶成為賬務(wù)數(shù)據(jù)庫(kù)熱點(diǎn),產(chǎn)生性能瓶頸點(diǎn),嚴(yán)重影響賬務(wù)數(shù)據(jù)庫(kù)的性能。

二、解決方案

從上面熱點(diǎn)賬戶的定義中,我們可以知道解決熱點(diǎn)賬戶帶來(lái)的數(shù)據(jù)庫(kù)性能問(wèn)題就是要解決高并發(fā)環(huán)境下數(shù)據(jù)庫(kù)鎖爭(zhēng)用問(wèn)題。

1.并發(fā)度控制

同一時(shí)刻,對(duì)同一賬戶修改的請(qǐng)求數(shù)越多,這個(gè)賬戶的所等待問(wèn)題就越嚴(yán)重,所謂并發(fā)度控制就是要控制同一時(shí)刻對(duì)熱點(diǎn)賬戶請(qǐng)求的數(shù)量,可以通過(guò)控制上游支付系統(tǒng)并發(fā)請(qǐng)求數(shù)據(jù)或者賬務(wù)系統(tǒng)處理的并發(fā)請(qǐng)求數(shù)來(lái)實(shí)現(xiàn)。
  這一方案的缺點(diǎn)是對(duì)業(yè)務(wù)是有損的,當(dāng)熱點(diǎn)賬戶出現(xiàn)的時(shí)候,支付或者賬務(wù)處理失敗率會(huì)增加,用戶的體驗(yàn)會(huì)變差,較大的銀行或者第三方支付公司用地比較少。

2.匯總明細(xì)記賬

實(shí)時(shí)的交易全部是insert賬務(wù)明細(xì)(insert的開(kāi)銷(xiāo)很小,能夠支持高并發(fā)。如果基于分布式部署,insert的并發(fā)容量理論上可以無(wú)限大),然后定時(shí)(比如每半個(gè)小時(shí))將之前半個(gè)小時(shí)內(nèi)的賬務(wù)明細(xì)sum出一個(gè)結(jié)算總金額,一筆入賬結(jié)算到指定賬戶。
  這個(gè)方案的缺點(diǎn)就是:交易不能實(shí)時(shí)入賬,其實(shí)如果控制好定時(shí)匯總?cè)胭~的頻度,比如分鐘級(jí),用戶也是可以接受的。這種方式對(duì)收單類業(yè)務(wù)(賬戶加錢(qián))非常實(shí)用,但是對(duì)支出類業(yè)務(wù)(賬戶減錢(qián))類來(lái)說(shuō),有賬戶透支地風(fēng)險(xiǎn)。

3.緩沖入賬

將實(shí)時(shí)同步的記賬請(qǐng)求進(jìn)行異步化,以達(dá)到記賬實(shí)時(shí)性和系統(tǒng)穩(wěn)定性之間平衡的記賬手段,這就是”削峰填谷“。
  詳細(xì)地講,假如賬務(wù)系統(tǒng)對(duì)同一個(gè)賬戶的處理閾值為100筆/s,24小時(shí)不間斷服務(wù)(一天能處理86400000筆)。當(dāng)業(yè)務(wù)高峰期來(lái)臨的時(shí)候,熱點(diǎn)賬務(wù)的請(qǐng)求數(shù)會(huì)達(dá)到200筆/s。當(dāng)賬戶的交易低于100筆/秒的時(shí)候,賬務(wù)系統(tǒng)幾乎還是實(shí)時(shí)地處理了記賬請(qǐng)求,而當(dāng)交易大于100筆/秒的時(shí)候,賬務(wù)系統(tǒng)先返回結(jié)果,把賬務(wù)處理丟到可靠的處理隊(duì)列中,等并發(fā)量不大的時(shí)候慢慢消化,對(duì)用戶來(lái)說(shuō)感受到的體驗(yàn)還是很快就記賬成功了。
  這個(gè)方案是有個(gè)前提是:熱點(diǎn)賬戶在某幾個(gè)高峰時(shí)間點(diǎn)需要緩沖記賬來(lái)削峰填谷,并且能在日間填完。一旦賬戶的日間交易量暴增,導(dǎo)致日間隊(duì)列根本來(lái)不及消化,整個(gè)隊(duì)列越來(lái)越長(zhǎng),那就不存在谷可以填,這時(shí)候肯定會(huì)帶來(lái)用戶大量的投訴。另外這種方案對(duì)支出類業(yè)務(wù)(賬戶減錢(qián))來(lái)講,也會(huì)有賬戶透支地風(fēng)險(xiǎn)。

4.熱點(diǎn)賬戶鎖分散

具體來(lái)講就是創(chuàng)建與熱點(diǎn)賬戶對(duì)應(yīng)的多個(gè)影子賬戶,所述影子賬戶與所述賬戶的數(shù)據(jù)結(jié)構(gòu)相同,將所述影子賬戶設(shè)置為隱藏,并將所述賬戶的余額分散至各個(gè)影子賬戶。當(dāng)賬務(wù)系統(tǒng)接收到賬務(wù)請(qǐng)求的時(shí)候,通過(guò)前置進(jìn)行hash分配(具體的hash函數(shù)會(huì)有更多方案)選擇影子賬戶進(jìn)行記賬,這樣就將原來(lái)對(duì)一個(gè)賬戶的請(qǐng)求分散到多個(gè)影子賬戶中,分散了賬務(wù)熱點(diǎn)。
  這個(gè)方案也有缺點(diǎn):通過(guò)算法選擇的影子賬戶扣款,影子賬戶的余額可能是不足的,但賬戶的總余額是夠的,這樣可能影響賬務(wù)處理的成功率。

5.提高服務(wù)鎖并發(fā)能力

提高單臺(tái)數(shù)據(jù)庫(kù)服務(wù)器處理能力(I/O,CPU,memory)或者選取內(nèi)存數(shù)據(jù)庫(kù)實(shí)時(shí)地處理記賬請(qǐng)求,然后異步地存儲(chǔ)到可靠數(shù)據(jù)庫(kù)上。

以上是一些用于解決熱點(diǎn)賬戶問(wèn)題的常用技術(shù),大家可以根據(jù)自己應(yīng)用場(chǎng)景來(lái)解決系統(tǒng)中的熱點(diǎn)賬務(wù)問(wèn)題,大家可能會(huì)有更好地解決方案,大家在積極留言評(píng)論,一起學(xué)習(xí),共同進(jìn)步。

最后編輯于
?著作權(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)容