1. 程式人生 > >【高併發】如何設計一個支撐高併發大流量的系統?這次我將設計思路分享給大家!

【高併發】如何設計一個支撐高併發大流量的系統?這次我將設計思路分享給大家!

## 寫在前面 > 最近不少小夥伴們都在問我:高併發專題我學了不少文章了,但是如何設計一個高併發的系統我還是一臉懵逼!這個問題怎麼解決呢?其實,相信不只是問我的這些小夥伴有這個困惑,就連工作(入坑)了好幾年的開發人員也都有這樣的困惑:我學習了很多的高併發課程,也看了不少的高大上的文章,可就是不知道怎麼去設計一個支撐高併發大流量的系統。針對小夥伴們的疑惑,這裡,我就把一些設計高併發大流量的常規思路分享給大家,不一定完全正確,設計高併發大流量系統本來就是一個仁者見仁、智者見智的事情,只要是符合自身業務場景的架構思路,都是好的架構思路,架構本身來說就是沒有一個完全正確的架構,而是儘量符合當時自身的業務場景,並且能夠良好的支撐業務的負載。 ## 高併發架構相關概念 ### 什麼是併發? 併發是指併發的訪問,也就是某個時間點,有多少個訪問同時到來; 通常如果一個系統的日PV在千萬以上,有可能是一個高併發的系統,這裡需要注意的是:只是有可能是一個高併發的系統,不一定是一個高併發的系統。 併發數和QPS是不同的概念,一般說QPS會說多少併發使用者下QPS,當QPS相同時,併發使用者數越大,網站併發處理能力越好。當併發使用者數過大時,會造成程序(執行緒)頻繁切換,反正真正用於處理請求的時間變少,每秒能夠處理的請求數反而變少,同時使用者的請求等待時間也會變大。 找到最佳執行緒數能夠讓web系統更穩定,效率更高。 併發數 = QPS*平均響應時間 ### 高併發具體關心什麼? **QPS:** 每秒請求或查詢的數量,在網際網路領域,指每秒響應請求數; **吞吐量:** 單位時間內處理的請求量(通常由QPS與併發數決定); **響應時間:** 從請求發出到收到響應花費的時間,例如一個系統處理一個HTTP請求需要100ms,這個100ms就是系統的響應時間; **PV:** 綜合瀏覽量,即頁面瀏覽量或者點選量,一個訪客在24小時內訪問的頁面數量; **UV:** 獨立訪客 ,即一定時間範圍內相同訪客多次訪問網站,只計算為一個獨立的訪客; **頻寬:** 計算頻寬大小需要關注兩個指標,**峰值流量和頁面的平均大小** ; 日網站頻寬可以使用下面的公式來粗略計算: ```bash 日網站頻寬=pv/統計時間(換算到秒)*平均頁面大小(單位kB)*8 ``` 峰值一般是平均值的倍數; QPS不等於併發連線數,QPS是每秒HTTP請求數量,併發連線數是系統同時處理的請求數量; ```bash 峰值每秒請求數(QPS) = (總PV數 * 80%) /(6小時秒數 * 20%) ``` **壓力測試:** 測試能承受的最大併發,測試最大承受的QPS值。 **測試工具(ab)**: 目標是URL,可以建立多個訪問執行緒對同一個URL進行訪問(Nginx); **ab的使用:** 模擬併發請求100次(100個人),總共請求5000次(每個人請求5000次) ```bash ab -c 100 -n 5000 待測試網站(記憶體和網路不超過最高限度的75%) ``` QPS達到50: 一般的伺服器就可以應付; **QPS達到100:** 假設關係型資料庫的每次請求在0.01秒完成(理想),假設單頁面只有一個SQL查詢,那麼100QPS意味著1秒中完成100次請求,但此時我們不能保證資料庫查詢能完成100次; 方案:資料庫快取層、資料庫的負載均衡; **QPS達到800:** 假設我們使用 百兆寬頻,意味著網站出口的實際頻寬是8M左右,假設每個頁面是有10k,在這個併發的條件下,百兆頻寬已經被吃完; 方案:CDN加速、負載均衡 **QPS達到1000:** 假設使用Redis快取資料庫查詢資料,每個頁面對Redis請求遠大於直接對DB的請求; Redis的悲觀併發數在5W左右,但有可能之前內網頻寬已經被吃光,表現出不穩定; 方案:靜態HTML快取 **QPS達到2000:** 檔案系統訪問鎖都成為了災難; 方案:做業務分離,分散式儲存; ## 高併發解決方案案例 **流量優化:** 防盜鏈處理(把一些惡意的請求拒之門外) **前端優化:** 減少HTTP請求、新增非同步請求、啟用瀏覽器的快取和檔案壓縮、CDN加速、建立獨立的圖片伺服器; **服務端優化:** 頁面靜態化處理、併發處理、佇列處理; **資料庫優化:** 資料庫的快取、分庫分表、分割槽操作、讀寫分離、負載均衡 **Web伺服器優化:** 負載均衡 ## 高併發下的經驗公式 ### 通過QPS和PV計算部署伺服器的臺數 **單臺伺服器每天PV計算** ```bash 公式1:每天總PV = QPS * 3600 * 6 公式2:每天總PV = QPS * 3600 * 8 ``` ### 伺服器計算 ```bash 伺服器數量 = ceil( 每天總PV / 單臺伺服器每天總PV ) ``` ### 峰值QPS和機器計算公式 **原理:** 每天80%的訪問集中在20%的時間裡,這20%時間叫做峰值時間 **公式:** ( 總PV數 * 80% ) / ( 每天秒數 * 20% ) = 峰值時間每秒請求數(QPS) **機器:** 峰值時間每秒QPS / 單臺機器的QPS = 需要的機器。 ## 重磅福利 關注「 **冰河技術** 」微信公眾號,後臺回覆 “設計模式” 關鍵字領取《深入淺出Java 23種設計模式》PDF文件。回覆“Java8”關鍵字領取《Java8新特性教程》PDF文件。兩本PDF均是由冰河原創並整理的超硬核教程,面試必備!! **好了,今天就聊到這兒吧!別忘了點個贊,給個在看和轉發,讓更多的人看到,一起學習,一起進步!!** ## 寫在最後 > 如果你覺得冰河寫的還不錯,請微信搜尋並關注「 **冰河技術** 」微信公眾號,跟冰河學習高併發、分散式、微服務、大資料、網際網路和雲原生技術,「 **冰河技術** 」微信公眾號更新了大量技術專題,每一篇技術文章乾貨滿滿!不少讀者已經通過閱讀「 **冰河技術** 」微信公眾號文章,吊打面試官,成功跳槽到大廠;也有不少讀者實現了技術上的飛躍,成為公司的技術骨幹!如果你也想像他們一樣提升自己的能力,實現技術能力的飛躍,進大廠,升職加薪,那就關注「 **冰河技術** 」微信公眾號吧,每天更新超硬核技術乾貨,讓你對如何提升技術能力不再迷茫! ![](https://img-blog.csdnimg.cn/20200716220443647.png#pic_