交易系統熱點賬戶問題(一)

2021-08-21 07:21:11 字數 2956 閱讀 9627

目錄

一、熱點賬戶

二、熱點賬戶常見問題

三、純修改餘額方式及其特點

熱點賬戶就是高頻進行扣款、入賬的賬戶,也就是熱點賬戶該條資料為熱點資料,會被頻繁更新。一般熱點賬戶分為兩種,一種是頻繁扣款的熱點賬戶,另外一種是頻繁入賬的熱點賬戶。

1、效能瓶頸問題

2、資料庫壓力問題

3、成功率問題

1. 樂觀鎖

操作方式:

查詢賬戶資料:

select  balance, status, version, … from account where id = ?

計算餘額:

post_balance = balance + amount

或者post_balance = balance - amount

更新賬戶餘額:

update …. balance = post_balance,version = version +1 where id = ? and version = ?

更新返回1,更新成功,返回0,更新失敗,需丟擲異常,回滾事務

插入賬戶歷史:

insert … 

優點:不會存在阻塞,響應時間快;

資料庫沒什麼壓力;

在記憶體裡可以完成很多複雜操作;

缺點:成功率不高,真的存在併發時,失敗的請求比較多;

有效的效能依然不高;

一般應對方案:

採用重試的方式,立即重試三次,以提高成功率

個人看法:

這種重試在真正的有量的時候基本沒啥作用,相反會徒增資料庫的請求量,鄙人覺得這種重試只能解決請求量較小的時候的併發,比如突然同時進來兩筆同乙個賬戶的請求,處理失敗的話進行重試是可以解決問題的;但是一瞬間進來200筆,甚至更多的話,這種重試沒啥作用了。

2. 悲觀鎖    

操作方式:

查詢賬戶資料:

select balance … from account for update with rs

計算餘額:

post_balance = balance + amount

或者post_balance = balance - amount

更新賬戶餘額:

update …. balance = post_balance,version = version +1 where id = ? 

插入賬戶歷史:

insert …

優點:成功率高;

效能好;

在記憶體裡可以完成很多複雜操作(餘額簽名);

缺點:會存在阻塞,響應時間長;

資料庫壓力大;

一般應對方案:

採用訊號量做熱點賬戶資源使用限制,可以控制資料庫壓力,為資料庫分壓,且保持在乙個客觀的效能水平。

個人看法:

這種方式能解決大部分的熱點賬戶問題,也是本人之前採取的方式,不過偶爾會存在的超時問題也僅僅是一兩筆,其餘的都會被訊號量拒絕了。

3.資料庫行級鎖1

操作方式:

更新餘額:

入賬:update balance = balance +amount where id = ?

扣款:update balance = balance - amount where id = ? and balance > amount

讀取賬戶資料:(讀取資料是為了在賬戶歷史插入的時候保留發生後餘額)

select * from account where id = ? with cs

插入資料

insert ...

優點:成功率高;

效能好(相對於2);

資料庫壓力也會小(相對於2);

相應時間也小(相對於悲觀鎖);

缺點:一些複雜的操作無法在記憶體完成了(餘額簽名)

一般應對方案:

複雜的操作非同步化,延遲也就是毫秒級別,或者捨棄簽名

個人看法:

這種方式與悲觀鎖相比好了很多,資料庫壓力小,效能高了,許增加上單賬戶限流或者訊號量,防止單賬戶暴漲的量把資料庫壓爆。

4.資料庫行級鎖2

操作方式:

更新餘額:

入賬:update balance = balance +amount where id = ?

扣款:update balance = balance - amount where id = ? and balance > amount

插入資料

insert …

非同步更新發生後餘額:(或者根據業務情況不需要該步驟)

update  account_history set post_balance = ? where  account_id =?

優點:成功率高;

效能好(相對於3);

資料庫壓力也會小(相對3);

相應時間也小(相對3);

缺點:**複雜度高,需要非同步化一些處理;

個人看法:

一些非核心部分的修改及操作,不需要就去掉,需要的話那就非同步處理下。

環境:spring + mybatis + db2

交易系統熱點賬戶問題

何為熱點賬戶?熱點賬戶即系統中,被高頻繁地進行資金的進出操作,頻繁出現加鎖解鎖操作的賬戶。比如,b2c系統中的企業虛擬戶,使用者購買商品時,資金從使用者虛擬戶轉到企業虛擬戶 使用者退款時,資金從企業虛擬戶轉到使用者虛擬戶 這時,對企業虛擬戶的資金進出操作就會成為整個業務的瓶頸。1.控制併發數 所有進...

交易系統熱點賬戶設計

背景 交易系統中會出現某些賬戶高頻進行扣款入賬的行為。這些賬戶可以分為兩種,一種是出賬熱點賬戶,另外一種使入賬熱點賬戶。單賬戶進行餘額更新會出現各種效能瓶頸 資料庫壓力 成功率等各種效能問題。目標 通過該設計避免出現熱點賬戶的各種效能問題,及時對賬戶是否使熱點進行監控,分析 避免出現熱點賬戶帶來的一...

交易系統表

賬戶資訊 select from tfundinfo 資訊 select from tasset 資產單元 select from tcombi 組合資訊 持倉資訊 select from tfundstock 持倉 select from tunitstock 組合持倉 資金資訊 select f...