在某一瞬間,單個帳戶集中的發生資金變更,若不加控制,其帳戶餘額會因發生髒讀、覆蓋更新等狀況而錯誤記錄。若是簡單的以悲觀鎖、樂觀鎖的方式限制,雖然不會發生數據錯誤,但會形成服務不可用(該帳戶的更新請求所有失敗)。而請求重試、再次網絡通訊的開銷並不能忽略不計。網絡
在帳戶系統的實際業務中,發生「熱點帳戶」狀況的通常有兩種:併發
局部熱點帳戶
還款時 一人 -> 多人
放款時 多人 -> 一人
債轉時 多人 -> 一人(基於業務系統的特定場景設置,此處認爲債權轉出人爲熱點帳戶)
局部熱點帳戶可經過分佈式鎖的方式處理,本文再也不贅述。框架
全局熱點帳戶
平臺支出帳戶、平臺收入帳戶、過渡帳戶。。這些帳戶老是在發生資金變更異步
既然是普適的解決方案,那就考慮該帳戶會大量併發的發生餘額增長、餘額減小、餘額凍結、餘額解凍的操做,其中餘額凍結和餘額解凍可視同爲增、減,簡化模型,下面以Hot帳戶爲例分佈式
1.收到請求 -> 2.落庫待處理,返回處理中 -> 3.落庫數據批量彙總處理,狀態控制 -> 4.返回處理結果(取決於第2步)
第2步可根據實際業務,返回成功(例如業務上餘額無限大的帳戶或者容許爲負值的帳戶)優化
雖然凍結至關於減,解凍至關於增,可是凍結得優先於解凍執行,因此最終得出了以下執行順序:
增->凍結->解凍->減spa
首先我要問,什麼場景下咱們須要獲得實時餘額?圖片
判斷錢夠不夠扣,夠不夠凍結?
No no no,咱們要求熱點帳戶的資金處理都必須異步,這意味着請求發過來只會獲得處理中,成功與否咱們會通知你。並且就是你查詢的時候錢充足,並不意味着發生變更的時候也充足,這類查詢是沒有意義的。要麼像ZF這類錢永遠充足的帳戶,查詢就更沒有意義了事務
財務、審計。。whatever須要統計數據?
這個能夠有,咱們將帳戶餘額和緩衝記錄表內的數據實時計算告訴你。可是不要說我實時計算的餘額不許,由於會有未提交的事務balabala。。那麼親,這和熱點帳戶不要緊,即便你查詢一個很是普通的帳戶,碰巧該帳戶同時在更新,你也查不許。。實時計算的餘額在那一瞬間是準確的,並且我認爲這類需求不會很大it