高併發理論與解決思路

高併發指的是:在同時或極短時間內,有大量的請求到達服務端,每 個請求都需要服務端耗費資源進行處理,並做出相應的反饋。 從服務端視角看高併發 服務端處理請求需要耗費服務端的資源,比如能同時開啓的進程數、能同 時運行的線程數、網絡連接數、cpu、I/O、內存等等,由於服務端資源是有限 的,那麼服務端能同時處理的請求也是有限的

高併發問題的本質就是:資源的有限性

高併發帶來的問題 服務端的處理和響應會越來越慢,甚至會丟棄部分請求不予處理,更嚴重 的會導致服務端崩潰。

 高併發問題並不是互聯網應用獨有 高併發問題的層面 比如:前端請求、Web服務器、Web應用、數據庫等

 

高併發處理的基本思路

一:從客戶端看

1:儘量減少請求數量,比如:依靠客戶端自身的緩存或處理能力

2:儘量減少對服務端資源的不必要耗費,比如:重複使用某些資源,如連接池 客戶端處理的基本原則就是:能不訪問服務端就不要訪問

二:從服務端看

1:增加資源供給,比如: (1)更大的網絡帶寬 (2)使用更高配置的服務器 (3)使用高性能的Web服務器 (4)使用高性能的數據庫     

2:請求分流,比如: (1)使用集羣 (2)分佈式的系統架構   

3:應用優化,比如: (1)使用更高效的編程語言 (2)優化處理業務邏輯的算法 (3)優化訪問數據庫的SQL

服務端的處理基本原則是:分而治之,並提高單個請求的處理速度

 

高併發處理的基本手段

是手段而非具體的方案 下面按照每個層面來談談處理的具體手段,注意不是高併發處理的方案, 方案是要結合具體的應用,綜合分析,選擇合適的手段組合起來。 另外還要注意,下面提到的手段都是 “包含但不限於” n

客戶端發出請求層面,常見的手段有: 1:儘量利用瀏覽器的緩存功能,減少訪問服務端,比如:js、css、圖片等

2:可以考慮使用壓縮傳輸的功能,減少網絡流量,也會提高傳輸速度

3:考慮使用異步請求,分批獲取數據

前端接收客戶端請求層面,常見的手段有:

一:比如Nginx這一層 1:動靜分離,部分靜態資源可以直接從Nginx返回 2:按請求的不同,分發到不同的後端進行處理,比如:負載均衡、業務拆分訪問等 3:前面再加上一層來做多個Nginx的負載均衡,比如:LVS、F5等 4:還可以在更前面使用CDN服務

二:比如Varnish這一層 1:還可以對動態內容進行緩存,儘量減少訪問後端服務 2:使用頁面片斷緩存技術,比如ESI(Edge Side Includes )

Web服務器層面,常見的手段有: 1:使用最新的JVM,並進行配置優化 2:合理選擇服務器的運行模式,比如有些服務器有Client和Server之分 3:對Web服務器進行配置優化,比如:調整內存數量、線程數量等 4:提供多個能提供相同服務的Web服務器,以實現負載均衡 5:仔細規劃Web服務器上部署的應用規模 6:對Web服務器進行集羣 7:提供專門的圖片、文件、視頻等靜態資源服務器

Web應用層面,常見的手段有: 這個可能全在Web服務器裏面,也可能有單獨的服務層 1:動態內容靜態化 2:Java開發優化 3:優化處理業務邏輯的算法 4:合理高效的利用緩存 5:優化訪問數據庫的Sql,可以考慮利用存儲過程等數據庫的能力 6:合理使用多線程,加快業務處理 7:部分業務可以考慮內存數據庫,或者是進行純內存處理 8:儘量避免遠程調用、大量I/O等耗時的操作 9:合理規劃事務等較爲耗資源的操作 10:合理使用異步處理 11:對部分業務考慮採用預處理或者預計算的方式,減少實時計算量 12:內部系統間的業務儘量直接調用、直接處理,減少WebService、工作流等

數據庫層面,常見的手段有: 1:合理選擇數據庫的引擎,比如Mysql的InnoDB與MyISAM引擎 2:進行配置優化 3:可以考慮使用存儲過程來處理複雜的數據邏輯 4:數據庫集羣,進行讀寫分離 5:合理設計數據庫的表結構、索引等 6:分庫、分表,降低單庫、單表的數據量 7:合理使用NoSql

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