高并發那點事
高并發帶來的問題:
1.用戶角度
頁面加載慢、功能操作后回應時間長、功能無法使用等,
2.開發者角度
介面超時、執行緒池耗盡、資料庫連接池耗盡(https://www.cnblogs.com/sweetchildomine/p/6591692.html)、資料庫獲取連接時間長、快取雪崩、導致其他系統功能和業務受到影響等,
問題分析:
個人認為可以從多維度,多角度分析處理高并發問題,系統設計、硬體資源、代碼、業務場景,每個維度的處理方式都不相同,但又有一定的聯系,無論是硬體、設計、代碼基本受限于業務的約束,同時業務的約束又反作用前三者,
分析問題瓶頸:
可通過一些工具(比如arthas)監控呼叫鏈,確認時間耗時在哪些地方,
執行緒池耗盡:可以通過適當增加rpc的執行緒池的并發數量或者動態擴展機器,
資料庫連接池耗盡:適當調整鏈接池最大并發數量、最大等待時間、連接池活躍數量
獲取連接池時間太久:適當縮小最大等待時間(如果不縮小這個時間,可能會導致正常的訪問在獲取資料庫連接的時候會排隊,比如后面是查詢請求會導致頁面一直在加載現象)
常規做法:
設計層面:
1.異步
對于不是必須要等待回傳結果的,可以考慮使用異步的方式(多執行緒、mq)來提高介面的回應,ps:mq的三大作用:異步、削峰、解耦,
2.加快取
因為大部分的高并發瓶頸在于資料庫扛不住壓力,應盡可能不讓請求落到資料庫層面,通過加快取(redis、本地快取等)的方式來減少資料庫的壓力,
3.架構設計上通過分布式等手段實作負載均衡
通過分布式的方式實作動態擴展,比如nginx實作對tomcat的請求分發,redis資源的集群配置,資料庫的主從實作讀寫分離等,
4.服務呼叫設定超時時間
作用:宏觀角度來說,它是為了確保服務鏈路的穩定性,提供了一種框架級的容錯能力,
微觀角度:
1)有效減少執行緒池耗盡
2)consumer呼叫provider,如果不設定超時時間,則consumer的回應時間肯定會大于provider的回應時間,當provider性能變差時,consumer的性能也會受到影響,因為它必須無限期地等待provider的回傳,假如整個呼叫鏈路經過了A、B、C、D多個服務,只要D的性能變差,就會自下而上影響到A、B、C,最終造成整個鏈路超時甚至癱瘓,因此設定超時時間是非常有必要的,
3)假設consumer是核心的商品服務,provider是非核心的評論服務,當評價服務出現性能問題時,商品服務可以接受不回傳評價資訊,從而保證能繼續對外提供服務,這樣情況下,就必須設定一個超時時間,當評價服務超過這個閾值時,商品服務不用繼續等待,
4)provider很有可能是因為某個瞬間的網路抖動或者機器高負載引起的超時,如果超時后直接放棄,某些場景會造成業務損失(比如庫存介面超時會導致下單失敗),因此,對于這種臨時性的服務抖動,如果在超時后重試一下是可以挽救的,所以有必要通過重試機制來解決,
參考:https://www.cnblogs.com/029zz010buct/p/12576428.html
硬體資源:

這里主要講的是對tomcat,redis,mysql等資源的評估,待補充,
代碼層面(兩個不釋放):事務中資料庫連接、資料庫鎖不釋放,
事務中有資料庫加鎖操作,在不影響業務的前提下盡量將加鎖操作往后放(因為加鎖操作只有事務提交后才釋放鎖);
應該盡可能減小事務范圍,事務中資料庫連接不釋放,如果事務中有大量計算等耗時作業,盡可能拆分事務,縮小事務粒度,
熱點賬戶問題:
資料庫中的鎖可能導致熱點賬戶問題,如果資料庫中有加鎖操作并且加鎖鎖頻率較高,可以通過將熱點賬戶進行拆分,通過鎖住子賬戶來解決(可參考https://blog.csdn.net/xmfsamsara/article/details/80295478)
業務場景:也可以理解為對資源的保護采取的處理措施
1.限流
當服務訪問達到閾值的時候,限制訪問頻率,常用手段有令牌桶演算法、漏桶演算法、滑動視窗、Guava限流、網關層限流、業務側代碼限流、nginx限流、中間件限流(具體參考:https://blog.csdn.net/sshduanzhijun/article/details/115019205)
2.熔斷
當A服務呼叫B服務的時候,B服務不可用時候,可以Mock一個值來避免A服務一直重試呼叫B服務導致超時或者導致A服務不可用等問題,
3.服務降級

服務降級中服務呼叫失敗可能導致重試以至于回應超時,甚至最后導致降級失敗,所以應該合理設定呼叫超時時間,詳情參考下面的“設定rpc超時時間”,
4.風控
對于部分業務需要校驗用戶風險等級,把風控呼叫放業務前面,能攔截部分請求,
5.削峰
對于秒殺等超大訪問,可以將請求放入訊息佇列,下游系統根據自身處理能力去mq中消費請求,
參考檔案:
事務內開啟執行緒詳解:https://www.cnblogs.com/sweetchildomine/p/6591692.html
設定rpc超時時間:
https://www.cnblogs.com/029zz010buct/p/12576428.html
限流:
https://blog.csdn.net/sshduanzhijun/article/details/115019205
熱點賬戶問題:
https://blog.csdn.net/xmfsamsara/article/details/80295478
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/286370.html
標籤:其他
