1. 程式人生 > >Web應用高併發處理方案

Web應用高併發處理方案

先來熟悉幾個關於高併發的關鍵引數!

QPS:每秒處理的請求數量!

響應時間:處理一個請求需要的時間!

吞吐量:單位時間內的處理請求數量!

最大併發數:同一時間能支援的最大請求數!

一般來說有下面這些常規辦法:

1,更多的靜態資源:將程式碼中的大量列舉(容器載入時寫入map,放入本地快取),資料庫中的定義表(定時任務放入快取),固定配置,HTML檔案等靜態化處理,快取起來!

2,圖片伺服器:一般來說,圖片在一個頁面上屬於資料量比較大的東西,儘量避免動態資料和圖片的順序渲染,使用圖片伺服器分離資料和圖片!

3,優化程式碼:儘量避免多層迴圈,避免多次訪問資料庫,使用多執行緒提高cpu使用率和執行速度,使用java8的流式處理和並行處理提高速度!

4,資料庫:採用分庫分表,mysql5.7之後,據說可以支援秒級百萬級資料查詢。速度相當之快,使用八庫1024表,可以滿足資料庫一秒數百萬的併發!同時可以開啟快取,寫入儲存過程等加快訪問時間!分庫分表之後還可以根據分表字段使用聯合查詢,避免了大多數資料庫架構分散式之後不能聯合查詢的缺點!

5,使用記憶體型資料儲存:使用redis等記憶體快取可以提高讀寫速度,在資料落庫之前快速讀寫資料,使用mongodb等作為大欄位,多位元組的key value儲存方式,防止關係型資料庫的不足!

6,負載均衡:使用nginx等負載均衡中介軟體,將請求分佈到不同的機器上,避免單個應用持續的處理引起血崩!

資料庫優化
1、單庫資料庫

一個初建的網站往往使用者群都是很小的,最簡單的網站架構就能解決實際的使用者需求,當然為了保證網站的穩定性和安全性,我們會把網站的應用部署到至少兩臺機器上,後臺的儲存使用資料庫,如果經濟實力允許,資料庫使用單臺伺服器部署

2、資料庫讀寫分離

一個數據庫主要負責寫操作我們稱之為主庫,一個數據庫專門負責讀操作我們稱之為副庫,副庫的資料都是從主庫匯入的,資料庫的讀寫分離可以有效的保證關鍵資料的安全性,但是有個缺點就是當用戶瀏覽資料時候,讀的資料都會有點延時,這種延時比起全站不可用那肯定是可以接受的。

3、快取技術

快取主要是適用於讀操作,並且快取的讀操作的效率要遠遠高於從資料庫以及硬碟讀取資料的效率。

5、資料庫的垂直拆分

業務再接著的增長下去,資料量也會隨之越來越大了,這樣發展下去總有一天主庫也會產生瓶頸了,那麼接下來我們又該如何解決主庫的瓶頸了?方法很簡單就是我們要拆分主庫的資料了,那麼我該以什麼維度拆分資料了?一個數據庫裡有很多張表,不同的表都針對不同的業務,網站的不同業務所帶來的資料量也不是不同的,這個時候系統的短板就是那些資料量最大的表,所以我們要把那些會讓資料庫產生瓶頸的表拆出來,例如電商系統裡商品表和交易表往往資料量非常大,那麼我們可以把這兩種表建立在單獨的兩個資料庫裡,這樣就拆分了資料庫的壓力,這種做法叫做資料垂直拆分
6、資料庫的水平拆分

表資料的處理已經超出了單臺伺服器的能力,這個時候我們就得對這個單庫單表的資料進行更進一步的拆分,也就是將一張表分佈到兩臺不同的資料庫裡,這個做法就是叫做資料的水平拆分了。可以根據專案拆分,再結合按年的拆分等。