讓“熱點(diǎn)賬戶”清涼一夏

3 評論 4114 瀏覽 16 收藏 22 分鐘

編輯導(dǎo)讀:“熱點(diǎn)賬戶”來源于銀行領(lǐng)域,指的是銀行或支付賬戶等需要進(jìn)行代收付等業(yè)務(wù)的中間內(nèi)部賬賬戶。本文作者圍繞“熱點(diǎn)賬戶”展開分析,提出一些常見的解決思路和案例,希望對你有幫助。

我們經(jīng)常聽到一個(gè)概念“熱點(diǎn)賬戶”,可能很多人不陌生什么是熱點(diǎn)賬戶,但是對如何解決熱點(diǎn)賬戶問題并沒有系統(tǒng)性的完整的思路。

事物總是發(fā)展的,事物所處的場景也是在不斷變化的,基于有限的經(jīng)驗(yàn)去解決無限的可能性是很好的技能。我們試圖從認(rèn)識熱點(diǎn)賬戶開始,再了解幾個(gè)常見的解決思路和案例,打開對熱點(diǎn)賬戶的世界。

一、關(guān)于賬戶

什么是賬戶這個(gè)話題就不展開討論了,我們之前也寫過很多跟賬戶相關(guān)的內(nèi)容。

了解賬戶的結(jié)構(gòu)是“入賬請求、賬戶流水、賬戶余額”;入賬請求產(chǎn)生了賬戶流水,賬戶流水更新賬戶余額;所以其中我們要關(guān)注賬戶流水的創(chuàng)建以及賬戶余額的更新,這里賬戶余額的更新要重點(diǎn)關(guān)注,這是后續(xù)造成熱點(diǎn)賬戶發(fā)生的主要的環(huán)節(jié)。

賬戶的賬務(wù)處理主要分三類:收錢,付錢,賬戶間轉(zhuǎn)賬;收錢針對一個(gè)賬戶的余額增加,付款是一個(gè)賬戶的余額減少,轉(zhuǎn)賬是兩個(gè)賬戶之間一個(gè)增加一個(gè)減少。

賬戶處理的存在最大并發(fā)量,超過這個(gè)并發(fā)量賬務(wù)處理就會(huì)出問題;賬戶賬務(wù)處理過程的線程控制,無論是收錢、付錢還是轉(zhuǎn)賬,為了保證賬務(wù)的準(zhǔn)確性,每次賬務(wù)處理都是一個(gè)單獨(dú)的事務(wù),就算是多個(gè)請求同時(shí)發(fā)生,對賬戶的操作也是一個(gè)一個(gè)的來;當(dāng)一筆入賬請求開始處理時(shí)賬戶資源會(huì)被加鎖,等該筆請求處理完以后會(huì)釋放鎖;這樣的話就意味著每一筆賬務(wù)處理都會(huì)獲得一個(gè)時(shí)間占用,這個(gè)時(shí)間內(nèi)其他入賬是不能操作的,這樣就出現(xiàn)了資源的瓶頸,也就是賬戶的入賬必然存在一個(gè)并發(fā)的最大閾值,一旦超過這個(gè)閾值,就會(huì)出現(xiàn)賬戶的性能問題。

熱點(diǎn)字段和熱點(diǎn)事件;在交易并發(fā)過程中,有些字段的使用頻率很高,比如流水號、余額、發(fā)生額等字段,這些使用頻率很高的字段稱為熱點(diǎn)字段;導(dǎo)致熱點(diǎn)字段的事件稱為熱點(diǎn)事件,比如商家結(jié)算日,需要給商家結(jié)算付款,這時(shí)候造成付款專戶的付款并發(fā),這個(gè)就是一個(gè)熱點(diǎn)事件。

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

業(yè)務(wù)發(fā)生以后會(huì)產(chǎn)生業(yè)務(wù)事件,比如下單支付,業(yè)務(wù)事件需要申請入賬;當(dāng)在短時(shí)間內(nèi)產(chǎn)生了大量的業(yè)務(wù)事件,或者狹義的看有大量的交易產(chǎn)生時(shí),造成高并發(fā)的入賬請求,高并發(fā)引起了賬戶系統(tǒng)的性能瓶頸而產(chǎn)生了性能問題,進(jìn)而造成入賬延遲、失敗、賬務(wù)準(zhǔn)確性等各種賬務(wù)問題;而這個(gè)過程中涉及到的賬戶我們就稱為熱點(diǎn)賬戶;所以說熱點(diǎn)賬戶是由于高并發(fā)交易時(shí)頻繁更新賬戶產(chǎn)生性能問題而造成的,所以這里一個(gè)關(guān)鍵的前提是“高并發(fā)”,那么熱點(diǎn)賬戶的標(biāo)準(zhǔn)是什么呢,在一些文獻(xiàn)里提到以下標(biāo)準(zhǔn)。

  • 賬戶每秒有10次以上更新需求
  • 串行化時(shí)賬戶處理延遲高于1秒以上

我想熱點(diǎn)賬戶產(chǎn)生的根本機(jī)理跟城市交通高峰時(shí)段的擁堵地段是一個(gè)機(jī)理,怎么解決高峰問題,錯(cuò)峰出行,限號限流,分流等等;同樣熱點(diǎn)賬戶也是,既然是高并發(fā)造成的擁堵,我們就可以以降低賬戶上的并發(fā)為目的,也就是降低熱點(diǎn)賬戶的操作并發(fā)以降低賬戶熱度;像可以緩存記賬,可以批量匯總記賬,可以將賬戶拆分分?jǐn)偛l(fā),可以進(jìn)行記賬排隊(duì)等等手段都可以降低對賬戶的高并發(fā)操作,從而降低賬戶熱度。

三、熱點(diǎn)賬戶常見發(fā)生場景

既然產(chǎn)生熱點(diǎn)賬戶的原因是高并發(fā)造成的賬戶被頻繁更新,所以我們探索熱點(diǎn)賬戶的發(fā)生場景就轉(zhuǎn)換成了探索交易高并發(fā)的場景,這些高并發(fā)場景都有可能造成熱點(diǎn)賬戶,比如很容易想到“雙11購物節(jié)”“微信發(fā)紅包”“某自營電商平臺的秒殺搶購”“小米官網(wǎng)新品的預(yù)售”等。

這里的場景有的是因?yàn)楦卟l(fā)收款造成的,有些是高并發(fā)付款造成的;而且收款和付款的熱點(diǎn)賬戶解決方案往往會(huì)存在差異,不同場景的收款和付款解決方案也會(huì)有差異;就像淘寶雙11收款,淘寶中間賬戶其實(shí)因?yàn)椴煌饴┙o用戶,后續(xù)商家履約周期也長,所以時(shí)效性要求并不高,可以考慮批量定時(shí)入賬、異步入賬、緩存入賬等,不采用實(shí)時(shí)入賬;所以我們可以將業(yè)務(wù)場景分為高頻入賬場景和高頻扣款場景;像淘寶雙11的中間擔(dān)保賬戶就是高頻入賬造成的熱點(diǎn)賬戶。

我們來分析一下淘寶雙11產(chǎn)生熱點(diǎn)賬戶的場景。

我們在淘寶購物時(shí)都清楚,錢是不會(huì)直接給到商家的,而是先收到中間擔(dān)保賬戶,等履約完成以后才會(huì)由擔(dān)保賬戶結(jié)算給商家,所以這里對于擔(dān)保賬戶來說有兩個(gè)過程,一個(gè)是用戶購買商品時(shí)的收款,另一個(gè)是服務(wù)履約以后的結(jié)算付款,而其中雙11期間的用戶付款就成了熱點(diǎn)事件,從而中間擔(dān)保賬戶的收款造成了擔(dān)保賬戶成為熱點(diǎn)賬戶。

上面我們介紹了,淘寶擔(dān)保賬戶是內(nèi)部賬戶,并不外漏給用戶或者商家,這樣的話,只需要實(shí)時(shí)告訴用戶和商家已經(jīng)付款成功即可,至于擔(dān)保賬戶的入賬可以慢慢的處理;這里我們也得到了一個(gè)思路,解決熱點(diǎn)賬戶要關(guān)注兩個(gè)問題。

一個(gè)是給用戶的反饋:對交易參與者的反饋策略,參與者需不需要實(shí)時(shí)知道賬戶的處理情況,是只需要知道結(jié)果即可還是需要實(shí)時(shí)看到賬戶余額的變化,顯然對于淘寶中間賬戶來說,賬戶參與者是不需要知道賬戶余額更新情況的,只需要知道支付成功的反饋結(jié)果即可,而這個(gè)結(jié)果可以依賴渠道的反饋通知,而內(nèi)部記賬可以不反饋給用戶,這樣的話擔(dān)保賬戶就有了足夠的時(shí)間和選擇來規(guī)避并發(fā)問題。

另一個(gè)是賬務(wù)要求:賬務(wù)更新時(shí)效性要求高不高,賬務(wù)的準(zhǔn)確性要求高不高,這里中間擔(dān)保戶對時(shí)效性要求不高,準(zhǔn)確性肯定是所有賬戶要求都是很高的。

這樣我們可以使用批量的延遲更新中間擔(dān)保賬戶的方式來規(guī)避雙11高并發(fā)交易的入賬請求,以規(guī)避熱點(diǎn)賬戶的發(fā)生。

這里我們要知道個(gè)事實(shí),數(shù)據(jù)庫插入數(shù)據(jù)的并發(fā)支持是非常大的,一般不會(huì)造成數(shù)據(jù)庫性能問題,批量插入即可,只是更新賬戶余額需要進(jìn)行鎖處理,會(huì)造成性能問題,所以解決淘寶中間賬戶的關(guān)鍵是解決賬戶余額更新問題。

首先我們先將高并發(fā)的交易的入賬請求插入到入賬流水表,這時(shí)并不著急去更新中間擔(dān)保賬戶余額,此時(shí)這些流水我們標(biāo)記一個(gè)入賬狀態(tài)“未入賬”;定時(shí)的去掃描這個(gè)流水表,將掃描到的數(shù)據(jù)進(jìn)行加鎖,確保不會(huì)被后續(xù)入賬或其他處理影響,然后匯總求和,用這個(gè)求和的總值去更新中間擔(dān)保賬戶的余額,然后將這一批“未入賬”流水更新為已入賬,然后釋放鎖,這樣就以很小的并發(fā)完成了對中間賬戶的更新。

下面我們介紹幾種常見的解決熱點(diǎn)賬戶的方案,并且針對每個(gè)方案我們列舉一個(gè)實(shí)際的案例為補(bǔ)充;對于熱點(diǎn)賬戶的方案設(shè)計(jì)過程中,我們需要重點(diǎn)關(guān)注幾個(gè)問題:

  • 收支:賬戶是收入熱點(diǎn)賬戶還是支出熱點(diǎn)賬戶
  • 內(nèi)外:賬戶是用戶熱點(diǎn)賬戶還是內(nèi)部熱點(diǎn)賬戶
  • 時(shí)效:賬戶是高時(shí)效性實(shí)時(shí)入賬還是不需要高時(shí)效性
  • 結(jié)果:用戶是否需要實(shí)時(shí)知道入賬結(jié)果還是不需要
  • 余額:用戶是否需要實(shí)時(shí)知道賬戶余額更新還是不需要

對于方案的設(shè)計(jì)和選擇可以先做以上幾個(gè)方面的分析,然后選擇合適的解決方案;比如上面淘寶中間擔(dān)保賬戶對時(shí)效性要求不高,用戶不需要感知余額的場景我們就可以選擇延遲批量匯總?cè)胭~。

對于方案的設(shè)計(jì),我們就可以基于以上幾個(gè)問題從解決“賬戶的單位并發(fā)”為核心突破點(diǎn),因?yàn)椴l(fā)造成的頻繁更新是熱點(diǎn)賬戶產(chǎn)生的根本原因,所以解決的熱點(diǎn)賬戶并發(fā)的問題也就可以解決熱點(diǎn)賬戶的問題。

四、限號限流-直接控制并發(fā)

第一性原理,不想太多,直接解決產(chǎn)生問題的問題本身;并發(fā)不是造成熱點(diǎn)賬戶么,那么反向思考,這個(gè)并發(fā)閾值是多少,在賬戶之前設(shè)到屏障控制這個(gè)閾值,開閘放水,門就這么大,只能進(jìn)來這么多水,就像很多城市的限號限流一樣,最終的結(jié)果肯定是損害一部分車主的體驗(yàn);雖然是立竿見影的效果,但是這也是自損800的方案;這里我們不妨稱之為“熱點(diǎn)閥”。

所以給賬戶安裝“熱點(diǎn)閥”可以解決熱點(diǎn)賬戶問題;但是問題還是比較明顯的,除非你很強(qiáng)勢,比如交通控制,否則以服務(wù)為第一客戶優(yōu)先的企業(yè)這種方式一般不會(huì)采用。

五、變多為少-明細(xì)匯總記賬

數(shù)據(jù)庫插入數(shù)據(jù)是可以支持非常高并發(fā),可能達(dá)到3.2w/s,所以插入流水不是熱點(diǎn)賬戶瓶頸所在,而是余額更新;所以我們就將“降低賬戶的單位并發(fā)”設(shè)計(jì)思路縮小到了“降低余額更新并發(fā)”的范圍;對于余額更新就是基于流水去增加或者減少余額,了解C語言的應(yīng)該知道,無非就是下面的這個(gè)函數(shù)(不一定準(zhǔn)確,但是這么個(gè)意思)。

balance=balance+發(fā)生額

就像新余額等于當(dāng)前余額加上或減去該流水的發(fā)生額,降低余額的更新頻率我們自然就可以想到,可以降低發(fā)生額的更新頻率,也就是你們這個(gè)多人來更新我,我實(shí)在是忙不過來,都堵在門口,不如你們派一個(gè)代表10分鐘進(jìn)來一次,匯總大家的要求我一次性解決;這樣就是我們說的“匯總明細(xì)記賬”的方法,這樣的話這個(gè)函數(shù)從意義上就變成了。

balance=balance+sum(一段時(shí)間內(nèi)全部明細(xì)的發(fā)生額)

這個(gè)方案的適用場景就是不需要實(shí)時(shí)更新余額,且主要是增加賬戶余額的場景如果是扣款類場景,可能匯總?cè)胭~會(huì)造成賬戶余額透支,不過如果允許賬戶透支,出款類場景也是可以考慮,只不過對資金管理的時(shí)效就會(huì)變差,你無法從賬戶余額直接看到剩余可用頭寸。

六、排隊(duì)辦理-緩沖記賬

現(xiàn)在大家經(jīng)常做核酸,因?yàn)椴l(fā)較大,檢測人員有限不能實(shí)時(shí)采集樣本,所以大家需要排一個(gè)很長的隊(duì)伍;同時(shí)因?yàn)橐粋€(gè)人一個(gè)人檢測成本也高,效率也低,所以10個(gè)人一組進(jìn)行混采;混采就像我們上面說的指派代表的匯總記賬一樣;所以說我們可以為賬戶設(shè)置一個(gè)排隊(duì)機(jī)制,出現(xiàn)高并發(fā)賬戶更新不過來時(shí)大家進(jìn)行排隊(duì)辦理。

就算排隊(duì)可以解決賬戶的并發(fā)問題,但是肯定是有天花板的,就像10個(gè)人采樣,100萬人排隊(duì),那要做到什么時(shí)候,也可能發(fā)生抱怨和投訴;所以怎么辦呢?增加檢測點(diǎn)是一個(gè)很好的辦法,1000個(gè)人采樣,就可以分?jǐn)傔@么多的要檢測的排隊(duì)的人;這就是我們下面要講的“子賬戶拆分”分?jǐn)倝毫Α?/p>

七、臨時(shí)存放點(diǎn)-緩存入賬

高并發(fā)請求可以先進(jìn)行緩存,然后定時(shí)將緩存更新到數(shù)據(jù)庫;這個(gè)看起來跟緩沖記賬異曲同工,但這里有個(gè)區(qū)別,緩沖記賬時(shí)賬務(wù)請求還在排隊(duì)入賬,而緩存記賬實(shí)際上賬務(wù)請求已經(jīng)實(shí)時(shí)在緩存中完成了記賬;緩存記賬具備緩沖記賬和匯總明細(xì)記賬的雙重優(yōu)點(diǎn)。

這里要注意因?yàn)榫彺嫘枰邆滟~戶余額部分的管理,所以賬戶系統(tǒng)的余額要賦予緩存模塊,緩存模塊在此余額基礎(chǔ)上進(jìn)行出金和入金的記賬操作;定期將緩存同步到賬戶系統(tǒng)完成最終的記賬,記賬完成的緩存部分可以進(jìn)行清空,然后獲得最新的賬戶余額,以此循環(huán)。

八、增加點(diǎn)位-子賬戶拆分

當(dāng)即要解決高并發(fā)的熱點(diǎn)賬戶問題又要保證實(shí)時(shí)性要求時(shí),上面的會(huì)影響賬戶更新時(shí)效的方案自然就不是首選了,那么就需要一個(gè)能夠支持實(shí)時(shí)余額更新的方案了;既然一個(gè)賬戶的更新出現(xiàn)了瓶頸,那是不是可以考慮為他找更多的幫手分?jǐn)倝毫δ??答案是肯定的;我們可以將賬戶進(jìn)行按需拆分,拆分成多個(gè)子賬戶,將高并發(fā)請求分配給各個(gè)子賬戶,從而每個(gè)子賬戶的并發(fā)就降下來了;這里要明確一個(gè)問題,這個(gè)子賬戶更多是不能讓用戶感知的,只是內(nèi)部的處理方案,對用戶來說還是一個(gè)賬戶,所以流水和賬戶余額反映給用戶的都是一個(gè);這就意味著:

賬戶作為一個(gè)整體被用戶感知。

這樣的話勢必要增加很多賬戶設(shè)計(jì)的復(fù)雜程度,比如入賬的時(shí)候入哪個(gè)子賬戶,是平均入賬還是按序入賬,出賬的時(shí)候怎么出,有個(gè)別子賬戶余額不足但是總賬戶余額充足時(shí)怎么處理;所以說這里會(huì)有一個(gè)復(fù)雜的賬務(wù)處理模型;不管這個(gè)模型怎么設(shè)計(jì),要保證金業(yè)務(wù)上順利完成賬務(wù)記錄要求以及用戶的使用體驗(yàn),從而確保業(yè)務(wù)的正常進(jìn)行。

我之前設(shè)計(jì)的賬戶系統(tǒng),每個(gè)商家可能會(huì)有七八個(gè)子賬戶,出款的時(shí)候是按照順序出款,就是先扣完一個(gè)賬戶扣下一個(gè)賬戶。

想起在某支付機(jī)構(gòu)做了斷直連接入網(wǎng)聯(lián)的改造項(xiàng)目,其實(shí)網(wǎng)聯(lián)的項(xiàng)目方案里提到了其要作為人行支付系統(tǒng)的前置系統(tǒng)做人行熱點(diǎn)賬戶系統(tǒng)的前置緩沖,我想這個(gè)設(shè)計(jì)方法是不是可以借鑒到工作當(dāng)中。

九、小弟先上-前置緩沖

為解決備付金集中存管所形成的熱點(diǎn)賬戶問題,實(shí)現(xiàn)對已映射額度管理,網(wǎng)聯(lián)構(gòu)建了“備付金熱點(diǎn)賬戶前置系統(tǒng)”即“RCMP”,用于支付機(jī)構(gòu)通過網(wǎng)聯(lián)平臺(EPCC)的業(yè)務(wù)辦理。

前置系統(tǒng)分為額度管理模塊及賬戶管理模塊,網(wǎng)聯(lián)將為各支付機(jī)構(gòu)在前置系統(tǒng)中建立賬戶,用于可用額度的監(jiān)控、已映射額度的管理。

因?yàn)榫W(wǎng)聯(lián)是“實(shí)時(shí)清算,定時(shí)結(jié)算”,在一個(gè)清算周期內(nèi)凈額軋差了支付機(jī)構(gòu)的支付指令,最后提交給人行的結(jié)算請求筆數(shù)一個(gè)周期從每個(gè)機(jī)構(gòu)的上千萬筆到一筆,這個(gè)看起來有點(diǎn)像匯總明細(xì)記賬,而這個(gè)匯總處理的操作是網(wǎng)聯(lián)代人行支付系統(tǒng)完成的。

那這么看,是不是我們工作當(dāng)中也需求這樣一個(gè)前置系統(tǒng),來幫助賬戶系統(tǒng)完成壓力的分擔(dān),比如要求業(yè)務(wù)方建設(shè)前置模塊,按照要求進(jìn)行處理加工后請求入賬;特別是賬戶中臺,面對眾多業(yè)務(wù)線時(shí),是不是可以考慮每個(gè)業(yè)務(wù)線在某些場景下都做賬戶前置,完成初步加工后再請求中臺賬戶系統(tǒng),這樣就可以分擔(dān)中臺的壓力,又不損害賬戶的中臺核心能力,業(yè)務(wù)線也不用完整建設(shè)賬戶系統(tǒng);這里的思路就是中臺不能一攬子大包,一些能力要分?jǐn)偨o業(yè)務(wù)線,比如業(yè)務(wù)線的個(gè)性化部分,需要業(yè)務(wù)線做前置層。

十、打鐵還需自身硬-技術(shù)性能升級

技術(shù)層面就不過多討論了,作為非專業(yè)人士,或者說產(chǎn)品視角提些建議“能多增加幾臺服務(wù)器么,可以擴(kuò)充下硬盤么,你這個(gè)cpu可不可以換成頂尖的……”

事物總是變化的,場景也是不斷地更新,面對新的場景,新的問題,歷史的經(jīng)驗(yàn)只能作為解決新問題的參考;不妨在遇到虛擬問題時(shí)多思考一下真實(shí)的世界,也許會(huì)有意料之外的答案!

#專欄作家#

陳天宇宙,微信公眾號:陳天宇宙,人人都是產(chǎn)品經(jīng)理專欄作家。多平臺支付領(lǐng)域?qū)谧髡撸曩Y深產(chǎn)品;天使投資人;專注為10萬支付產(chǎn)品經(jīng)理和支付機(jī)構(gòu)以及企業(yè)提供深度支付內(nèi)容和服務(wù)!

本文原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)許可,禁止轉(zhuǎn)載。

題圖來自Unsplash,基于CC0協(xié)議。

更多精彩內(nèi)容,請關(guān)注人人都是產(chǎn)品經(jīng)理微信公眾號或下載App
評論
評論請登錄
  1. 熱點(diǎn)賬戶似乎更容易變現(xiàn),一般限流的賬號就很難再白了…

    回復(fù)
  2. 之前在文章中看到過熱點(diǎn)賬戶這個(gè)詞,看了作者文章才知道里面的意思

    來自山東 回復(fù)
  3. 這個(gè)倒是第一次見到“熱點(diǎn)賬戶”這個(gè)新鮮詞匯,看完之后又獲得儲備了,再一次的知識收割機(jī)。

    來自河南 回復(fù)