業務流程
對於乙個融資標的invest表, 標的id,標的總融資金額(total_money), 已投資金額(invested_money),滿標時間(finish_invest_time),標的狀態(status)
假如有多個使用者user同時投標,投資金額為m, 為保證資料一致性,以下步聚在同乙個事務當中
1. 查詢left = total_money - invested_money, 如果left <=0, 則不可投, 如果m > left, 則提示投資金額不能大於剩餘可投金額
2. 查詢使用者資金餘額balance, 如果balance3. int rows = update user表set balance = balance - m where id = ? and balance - m >=0,如果rows=0,則回滾
4. 插入記錄到已投資列表表中insert into invest_list表
5. int rows = update invest表 set invested_money = invested_money + m where id = ? and invested_money + m <= total_money, 如果rows=0則事務回滾
6. 查詢left = total_money - invested_money,如果left=0,則更改狀態status為'還款中',滿標時間為當前時間
7.給使用者傳送簡訊或郵件提示投標成功
如果按照此事務流程,系統最容易堵塞在步驟5中,系統的併發度比較低, 所以計畫採用非同步佇列的方式
將標的id,和可投資金額left=total_money - invested_money儲存在記憶體concurrenthashmap中, 當使用者投資金額m時, left = left - m,如果left> 0時,表示可投,則分出乙個執行緒並在同乙個事務中用來執行如下操作
1. 查詢使用者資金餘額balance, 如果balance2. int rows = update user表set balance = balance - m where id = ? and balance - m >=0,如果rows=0,則回滾並將map中left加回m
3. 插入記錄到已投資列表表中insert into invest_list表,並將該使用者投資記錄放到乙個queue中去
4. 從queue中取出該使用者投資記錄,並非同步執行上乙個事務的5、6、7步聚
總結, 想方設法將單事務任務轉變成多執行緒任務來執行, 使用訊息佇列來達到最終一致性
Linux 高併發下效能優化
ulimit用於shell啟動程序所占用的資源,暫時地,適用於通過 ulimit 命令登入 shell 會話期間 vi etc profile 儲存後執行 source etc profile 使其生效 ulimit 顯示 或設定 使用者可以使用的資源的限制 limit 這限制分為軟限制 當前限制 ...
高併發下的nginx優化
網際網路分布式架構設計,提高系統併發能力的方式主要有兩種 垂直擴充套件 scale up 與水平擴充套件 scale out 垂直擴充套件 提公升單機處理能力。垂直擴充套件的方式又有兩種。增強單機硬體效能 提公升單機架構效能 水平擴充套件 增加伺服器,集群。在網際網路業務發展非常迅猛的早期,如果預算...
高併發下RPC通訊優化路徑
選擇合適的通訊協議 基於 tcp 協議實現的 socket 通訊是有連線的,而傳輸資料是要通過三次握手來實現資料 傳輸的可靠性,且傳輸資料是沒有邊界的,採用的是位元組流模式。基於 udp 協議實現的 socket 通訊,客戶端不需要建立連線,只需要建立乙個套接字傳送 資料報給服務端,這樣就不能保證資...