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

冰河團隊發表於2020-07-26

寫在前面

最近不少小夥伴們都在問我:高併發專題我學了不少文章了,但是如何設計一個高併發的系統我還是一臉懵逼!這個問題怎麼解決呢?其實,相信不只是問我的這些小夥伴有這個困惑,就連工作(入坑)了好幾年的開發人員也都有這樣的困惑:我學習了很多的高併發課程,也看了不少的高大上的文章,可就是不知道怎麼去設計一個支撐高併發大流量的系統。針對小夥伴們的疑惑,這裡,我就把一些設計高併發大流量的常規思路分享給大家,不一定完全正確,設計高併發大流量系統本來就是一個仁者見仁、智者見智的事情,只要是符合自身業務場景的架構思路,都是好的架構思路,架構本身來說就是沒有一個完全正確的架構,而是儘量符合當時自身的業務場景,並且能夠良好的支撐業務的負載。

高併發架構相關概念

什麼是併發?

併發是指併發的訪問,也就是某個時間點,有多少個訪問同時到來;

通常如果一個系統的日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均是由冰河原創並整理的超硬核教程,面試必備!!

好了,今天就聊到這兒吧!別忘了點個贊,給個在看和轉發,讓更多的人看到,一起學習,一起進步!!

寫在最後

如果你覺得冰河寫的還不錯,請微信搜尋並關注「 冰河技術 」微信公眾號,跟冰河學習高併發、分散式、微服務、大資料、網際網路和雲原生技術,「 冰河技術 」微信公眾號更新了大量技術專題,每一篇技術文章乾貨滿滿!不少讀者已經通過閱讀「 冰河技術 」微信公眾號文章,吊打面試官,成功跳槽到大廠;也有不少讀者實現了技術上的飛躍,成為公司的技術骨幹!如果你也想像他們一樣提升自己的能力,實現技術能力的飛躍,進大廠,升職加薪,那就關注「 冰河技術 」微信公眾號吧,每天更新超硬核技術乾貨,讓你對如何提升技術能力不再迷茫!

相關文章