今天主要是對JAVA_WEB中高並發的概念及常見的處理手段做個基本介紹,后面會每個點都做詳細的介紹及實現。
何謂高並發
高並發指的是:在同時或極短時間內,有大量的請求到達服務端,每個請求都需要服務端耗費資源進行處理,並做出相應的反饋。
從服務端視角看高並發服務端處理請求需要耗費服務端的資源,比如能同時開啟的進程數、能同時運行的線程數、網絡連接數、
cpu、I/O、內存等等,由於服務端資源是有限的,那么服務端能同時處理的請求也是有限的;
高並發問題的本質就是:資源的有限性
高並發帶來的問題
服務端的處理和響應會越來越慢,甚至會丟棄部分請求不予處理,更嚴重的會導致服務端崩潰。高並發問題並不是互聯網應用獨有。
高並發問題的層面比如:前端請求、Web服務器、Web應用、數據庫等。
高並發處理的基本思路
一:從客戶端看
1:盡量減少請求數量,比如:依靠客戶端自身的緩存或處理能力
2:盡量減少對服務端資源的不必要耗費,比如:重復使用某些資源,如連接池
客戶端處理的基本原則就是:能不訪問服務端就不要訪問
二:從服務端看
1:增加資源供給,比如:
(1)更大的網絡帶寬;
(2)使用更高配置的服務器;
(3)使用高性能的Web服務器;
(4)使用高性能的數據庫;
2:請求分流,比如:
(1)使用集群;
(2)分布式的系統架構;
3:應用優化,比如:
(1)使用更高效的編程語言
(2)優化處理業務邏輯的算法
(3)優化訪問數據庫的SQL
服務端的處理基本原則是:分而治之,並提高單個請求的處理速度。
高並發處理的基本手段
客戶端發出請求層面,常見的手段有:
1:盡量利用瀏覽器的緩存功能,減少訪問服務端,比如:js、css、圖片等;
2:可以考慮使用壓縮傳輸的功能,減少網絡流量,也會提高傳輸速度;
3:考慮使用異步請求,分批獲取數據;
前端接收客戶端請求層面,常見的手段有:
1:動靜分離,部分靜態資源可以直接從Nginx返回;
2:按請求的不同,分發到不同的后端進行處理,比如:負載均衡、業務拆分訪問等;
3:前面再加上一層來做多個Nginx的負載均衡,比如:LVS、F5等;
4:還可以在更前面使用CDN服務;
5:還可以對動態內容進行緩存,盡量減少訪問后端服務;
6:使用頁面片斷緩存技術,比如ESI(Edge Side Includes );
Web服務器層面,常見的手段有:
1:使用最新的JVM,並進行配置優化;
2:合理選擇服務器的運行模式,比如有些服務器有Client和Server之分;
3:對Web服務器進行配置優化,比如:調整內存數量、線程數量等;
4:提供多個能提供相同服務的Web服務器,以實現負載均衡;
5:仔細規划Web服務器上部署的應用規模;
6:對Web服務器進行集群;
7:提供專門的圖片、文件、視頻等靜態資源服務器;
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;