對號入座,快看看你的應用系統用了哪些高併發技術?

一 系統簡介

百舸流量運營平臺承接着京東金融APP核心資源位和京東APP部分重要資源位,大促單接口QPS達到10w+,壓測單接口到20w+,典型的c端讀鏈路高併發場景。接下來,聊聊我們的系統都有哪些應對高併發的“武功祕籍”。





 

二 “武功祕籍”

1 緩存(redis緩存,本地緩存)

緩存是提高系統的併發和提升系統的性能利器。redis分佈式緩存用來解決緩存容量和性能問題,本地緩存用來解決redis的熱key問題和提升性能。

詳情可以查看之前的文章《服務端應用多級緩存架構方案》

2 限流

限流是保護系統的一種策略,限流是控制接受請求的速率,通過壓測提前預知系統可承載的併發量,是對系統資源的前置保護,保證系統容量範圍內的請求能夠正常返回,超過容量的請求丟棄。

可通過JSF配置限流或者sentinel實現限流。經典算法:令牌桶,漏桶,滑動時間窗口。

3 熔斷降級

熔斷也是保護系統的一種手段,分佈式系統中系統之間通過微服務調用,偶爾會出現依賴的某個服務不可用或者耗時驟增,導致耗盡業務線程池,從而拖垮整個服務,可通過sentinel配置慢調用比例或者異常比例策略,達到熔斷閾值後,接下來的熔斷時長內請求會自動被熔斷。經過熔斷時長後熔斷器會進入探測恢復狀態(HALF-OPEN 狀態),若接下來的一個請求成功通過後,則結束熔斷,否則繼續熔斷。 實際過程中,需要結合上下游鏈路,設置合理的超時時間以及兜底數據。

常見的降級類型有:日常降級;大促非核心接口降級;大促日誌降級,只打印error級別日誌。

4 異步(CompletableFuture,MQ)

系統解耦:完成一項業務指令通常需要多個微服務協作,核心業務完成後,可通過消息的方式進行異步解耦,讓其他服務訂閱消息,完成各自的業務邏輯,適用於無需用戶等待感知的場景。

提升性能:在C端用戶等待的感知的場景,需要多個微服務協作,如果串行RPC調用,耗時是每個服務耗時之和,可通過CompletableFuture實現RPC異步調用,當使用時彙總結果,提升系統的性能。

5 池化技術

池化技術思想: 池化思想的解決的核心思想是通過預先創建數據庫連接或者線程放入池中,以便在需要時可以重複使用,減少創建和銷燬的開銷,提高系統的性能和併發。

數據庫連接池:如果是部署多臺機器,注意多臺機器連接數是否超過數據庫最大連接數,避免出現連接不上問題。

業務線程池:自定義線程池,根據業務採用合適的拒絕策略,注意線程隔離,避免某個接口異常拖垮整個應用。

6 代碼優化

減少調用鏈路,優化代碼邏輯執行順序,將阻斷校驗流程前置,優化數據結構和算法,優化查詢邏輯,減少IO次數等。

7 JVM調優

使用G1垃圾回收器,應用系統根據自己的業務情況配置JVM參數,常規4C8G通用配置可參考:

  -Xms4096m -Xmx4096m -XX:MaxMetaspaceSize=256m -XX:MetaspaceSize=256m -XX:+UseG1GC -XX:MaxGCPauseMillis=80

核心參數:-Xms初始堆大小,-Xmx最大堆大小,MaxMetaspaceSize最大元空間大小,MetaspaceSize表示Metaspace首次使用不足時觸發Full GC(全面垃圾回收)的閾值,垃圾回收機制使用G1回收器,MaxGCPauseMillis在jvm垃圾回收過程中允許停頓的最大毫秒時間。

8 分治思想,橫向擴展,

應用服務應該設計爲無狀態的,可通過增加應用實例數量來應對突發流量,將流量分到每臺機器上,同樣可以將應用進行按照業務拆分,單獨部署,提高系統併發。

合併批量請求,將多次調用改爲一次批量調用,減少網絡開銷。

9 預熱

通過定時任務或者初始化腳本提前將數據加載到內存,提高系統的性能,常見的有緩存數據預熱,ES數據預熱等。

針對應用升級或者重啓抖動,可以通過JSF預熱的方式,應用重啓後,在預熱時間內,流量逐漸增加的方式,減少抖動。

JSF預熱可參考文章《後端服務之應用預熱》

10 數據異構

業務數據通常存儲在支持事務的關係型數據庫中,當在面對複雜查詢場景時捉襟見肘,可將數據通過binlog異構到ES中,ES支持複雜場景的查詢並且有較高的性能,輕鬆突破數據庫單表數據量大及多表關聯查詢瓶頸。

數據異構可參考文章《記一次生產慢sql索引優化及思考》 中的目錄五:長期優化方案。

11 分庫分表,數據庫優化

分庫和分表各抗什麼?

分表:當一個表中的數據量過大時,會導致查詢速度變慢、插入和更新操作效率下降等問題。通過分表,每個小表的數據量就相對較小,性能問題得以緩解。

分庫:當一個數據庫實例無法承受大量數據的存儲和併發時,可通過分庫來分散系統壓力。

通常情況下,分庫和分表是結合使用的。

數據庫優化中常見的是sql優化,是否命中索引,提高服務器硬件配置。

三 總結

以上爲百舸系統處理高併發問題的一些策略,高併發架構是演進而來,避免過度設計,沒有一個技術能解決所有的問題,抓住關鍵矛盾,使用前一定要做好調研和評估,還有哪些?歡迎補充。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章