寫在前面
最近不少小夥伴們都在問我:高併發專題我學了不少文章了,但是如何設計一個高併發的系統我還是一臉懵逼!這個問題怎麼解決呢?其實,相信不只是問我的這些小夥伴有這個困惑,就連工作(入坑)了好幾年的開發人員也都有這樣的困惑:我學習了很多的高併發課程,也看了不少的高大上的文章,可就是不知道怎麼去設計一個支撐高併發大流量的系統。針對小夥伴們的疑惑,這裡,我就把一些設計高併發大流量的常規思路分享給大家,不一定完全正確,設計高併發大流量系統本來就是一個仁者見仁、智者見智的事情,只要是符合自身業務場景的架構思路,都是好的架構思路,架構本身來說就是沒有一個完全正確的架構,而是儘量符合當時自身的業務場景,並且能夠良好的支撐業務的負載。
高併發架構相關概念
什麼是併發?
併發是指併發的訪問,也就是某個時間點,有多少個訪問同時到來;
通常如果一個系統的日PV在千萬以上,有可能是一個高併發的系統,這裡需要注意的是:只是有可能是一個高併發的系統,不一定是一個高併發的系統。
併發數和QPS是不同的概念,一般說QPS會說多少併發使用者下QPS,當QPS相同時,併發使用者數越大,網站併發處理能力越好。當併發使用者數過大時,會造成程式(執行緒)頻繁切換,反正真正用於處理請求的時間變少,每秒能夠處理的請求數反而變少,同時使用者的請求等待時間也會變大。 找到最佳執行緒數能夠讓web系統更穩定,效率更高。
併發數 = QPS*平均響應時間
高併發具體關心什麼?
QPS: 每秒請求或查詢的數量,在網際網路領域,指每秒響應請求數;
吞吐量: 單位時間內處理的請求量(通常由QPS與併發數決定);
響應時間: 從請求發出到收到響應花費的時間,例如一個系統處理一個HTTP請求需要100ms,這個100ms就是系統的響應時間;
PV: 綜合瀏覽量,即頁面瀏覽量或者點選量,一個訪客在24小時內訪問的頁面數量;
UV: 獨立訪客 ,即一定時間範圍內相同訪客多次訪問網站,只計算為一個獨立的訪客;
頻寬: 計算頻寬大小需要關注兩個指標,峰值流量和頁面的平均大小 ;
日網站頻寬可以使用下面的公式來粗略計算:
日網站頻寬=pv/統計時間(換算到秒)*平均頁面大小(單位kB)*8
峰值一般是平均值的倍數;
QPS不等於併發連線數,QPS是每秒HTTP請求數量,併發連線數是系統同時處理的請求數量;
峰值每秒請求數(QPS) = (總PV數 * 80%) /(6小時秒數 * 20%)
壓力測試: 測試能承受的最大併發,測試最大承受的QPS值。
測試工具(ab): 目標是URL,可以建立多個訪問執行緒對同一個URL進行訪問(Nginx);
ab的使用: 模擬併發請求100次(100個人),總共請求5000次(每個人請求5000次)
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計算
公式1:每天總PV = QPS * 3600 * 6
公式2:每天總PV = QPS * 3600 * 8
伺服器計算
伺服器數量 = ceil( 每天總PV / 單臺伺服器每天總PV )
峰值QPS和機器計算公式
原理: 每天80%的訪問集中在20%的時間裡,這20%時間叫做峰值時間
公式: ( 總PV數 * 80% ) / ( 每天秒數 * 20% ) = 峰值時間每秒請求數(QPS)
機器: 峰值時間每秒QPS / 單臺機器的QPS = 需要的機器。
重磅福利
關注「 冰河技術 」微信公眾號,後臺回覆 “設計模式” 關鍵字領取《深入淺出Java 23種設計模式》PDF文件。回覆“Java8”關鍵字領取《Java8新特性教程》PDF文件。兩本PDF均是由冰河原創並整理的超硬核教程,面試必備!!
好了,今天就聊到這兒吧!別忘了點個贊,給個在看和轉發,讓更多的人看到,一起學習,一起進步!!
寫在最後
如果你覺得冰河寫的還不錯,請微信搜尋並關注「 冰河技術 」微信公眾號,跟冰河學習高併發、分散式、微服務、大資料、網際網路和雲原生技術,「 冰河技術 」微信公眾號更新了大量技術專題,每一篇技術文章乾貨滿滿!不少讀者已經通過閱讀「 冰河技術 」微信公眾號文章,吊打面試官,成功跳槽到大廠;也有不少讀者實現了技術上的飛躍,成為公司的技術骨幹!如果你也想像他們一樣提升自己的能力,實現技術能力的飛躍,進大廠,升職加薪,那就關注「 冰河技術 」微信公眾號吧,每天更新超硬核技術乾貨,讓你對如何提升技術能力不再迷茫!