如何設(shè)計(jì)一個(gè)支撐高并發(fā)大流量的系統(tǒng)?這次我將設(shè)計(jì)思路分享給大家!
作者個(gè)人研發(fā)的在高并發(fā)場(chǎng)景下,提供的簡(jiǎn)單、穩(wěn)定、可擴(kuò)展的延遲消息隊(duì)列框架,具有精準(zhǔn)的定時(shí)任務(wù)和延遲隊(duì)列處理功能。自開(kāi)源半年多以來(lái),已成功為十幾家中小型企業(yè)提供了精準(zhǔn)定時(shí)調(diào)度方案,經(jīng)受住了生產(chǎn)環(huán)境的考驗(yàn)。為使更多童鞋受益,現(xiàn)給出開(kāi)源框架地址:https://github.com/sunshinelyz/mykit-delay
寫在前面
最近不少小伙伴們都在問(wèn)我:高并發(fā)專題我學(xué)了不少文章了,但是如何設(shè)計(jì)一個(gè)高并發(fā)的系統(tǒng)我還是一臉懵逼!這個(gè)問(wèn)題怎么解決呢?其實(shí),相信不只是問(wèn)我的這些小伙伴有這個(gè)困惑,就連工作(入坑)了好幾年的開(kāi)發(fā)人員也都有這樣的困惑:我學(xué)習(xí)了很多的高并發(fā)課程,也看了不少的高大上的文章,可就是不知道怎么去設(shè)計(jì)一個(gè)支撐高并發(fā)大流量的系統(tǒng)。針對(duì)小伙伴們的疑惑,這里,我就把一些設(shè)計(jì)高并發(fā)大流量的常規(guī)思路分享給大家,不一定完全正確,設(shè)計(jì)高并發(fā)大流量系統(tǒng)本來(lái)就是一個(gè)仁者見(jiàn)仁、智者見(jiàn)智的事情,只要是符合自身業(yè)務(wù)場(chǎng)景的架構(gòu)思路,都是好的架構(gòu)思路,架構(gòu)本身來(lái)說(shuō)就是沒(méi)有一個(gè)完全正確的架構(gòu),而是盡量符合當(dāng)時(shí)自身的業(yè)務(wù)場(chǎng)景,并且能夠良好的支撐業(yè)務(wù)的負(fù)載。
高并發(fā)架構(gòu)相關(guān)概念
什么是并發(fā)?
并發(fā)是指并發(fā)的訪問(wèn),也就是某個(gè)時(shí)間點(diǎn),有多少個(gè)訪問(wèn)同時(shí)到來(lái);
通常如果一個(gè)系統(tǒng)的日PV在千萬(wàn)以上,有可能是一個(gè)高并發(fā)的系統(tǒng),這里需要注意的是:只是有可能是一個(gè)高并發(fā)的系統(tǒng),不一定是一個(gè)高并發(fā)的系統(tǒng)。
并發(fā)數(shù)和QPS是不同的概念,一般說(shuō)QPS會(huì)說(shuō)多少并發(fā)用戶下QPS,當(dāng)QPS相同時(shí),并發(fā)用戶數(shù)越大,網(wǎng)站并發(fā)處理能力越好。當(dāng)并發(fā)用戶數(shù)過(guò)大時(shí),會(huì)造成進(jìn)程(線程)頻繁切換,反正真正用于處理請(qǐng)求的時(shí)間變少,每秒能夠處理的請(qǐng)求數(shù)反而變少,同時(shí)用戶的請(qǐng)求等待時(shí)間也會(huì)變大。找到最佳線程數(shù)能夠讓web系統(tǒng)更穩(wěn)定,效率更高。
并發(fā)數(shù) = QPS*平均響應(yīng)時(shí)間
高并發(fā)具體關(guān)心什么?
QPS: 每秒請(qǐng)求或查詢的數(shù)量,在互聯(lián)網(wǎng)領(lǐng)域,指每秒響應(yīng)請(qǐng)求數(shù);
吞吐量: 單位時(shí)間內(nèi)處理的請(qǐng)求量(通常由QPS與并發(fā)數(shù)決定);
響應(yīng)時(shí)間: 從請(qǐng)求發(fā)出到收到響應(yīng)花費(fèi)的時(shí)間,例如一個(gè)系統(tǒng)處理一個(gè)HTTP請(qǐng)求需要100ms,這個(gè)100ms就是系統(tǒng)的響應(yīng)時(shí)間;
PV: 綜合瀏覽量,即頁(yè)面瀏覽量或者點(diǎn)擊量,一個(gè)訪客在24小時(shí)內(nèi)訪問(wèn)的頁(yè)面數(shù)量;
UV: 獨(dú)立訪客 ,即一定時(shí)間范圍內(nèi)相同訪客多次訪問(wèn)網(wǎng)站,只計(jì)算為一個(gè)獨(dú)立的訪客;
帶寬: 計(jì)算帶寬大小需要關(guān)注兩個(gè)指標(biāo),峰值流量和頁(yè)面的平均大小 ;
日網(wǎng)站帶寬可以使用下面的公式來(lái)粗略計(jì)算:
- 日網(wǎng)站帶寬=pv/統(tǒng)計(jì)時(shí)間(換算到秒)*平均頁(yè)面大?。▎挝籯B)*8
峰值一般是平均值的倍數(shù);
QPS不等于并發(fā)連接數(shù),QPS是每秒HTTP請(qǐng)求數(shù)量,并發(fā)連接數(shù)是系統(tǒng)同時(shí)處理的請(qǐng)求數(shù)量;
- 峰值每秒請(qǐng)求數(shù)(QPS) = (總PV數(shù) * 80%) /(6小時(shí)秒數(shù) * 20%)
壓力測(cè)試: 測(cè)試能承受的最大并發(fā),測(cè)試最大承受的QPS值。
測(cè)試工具(ab):目標(biāo)是URL,可以創(chuàng)建多個(gè)訪問(wèn)線程對(duì)同一個(gè)URL進(jìn)行訪問(wèn)(Nginx);
ab的使用: 模擬并發(fā)請(qǐng)求100次(100個(gè)人),總共請(qǐng)求5000次(每個(gè)人請(qǐng)求5000次)
- ab -c 100 -n 5000 待測(cè)試網(wǎng)站(內(nèi)存和網(wǎng)絡(luò)不超過(guò)最高限度的75%)
QPS達(dá)到50:一般的服務(wù)器就可以應(yīng)付;
QPS達(dá)到100: 假設(shè)關(guān)系型數(shù)據(jù)庫(kù)的每次請(qǐng)求在0.01秒完成(理想),假設(shè)單頁(yè)面只有一個(gè)SQL查詢,那么100QPS意味著1秒中完成100次請(qǐng)求,但此時(shí)我們不能保證數(shù)據(jù)庫(kù)查詢能完成100次;
方案:數(shù)據(jù)庫(kù)緩存層、數(shù)據(jù)庫(kù)的負(fù)載均衡;
QPS達(dá)到800: 假設(shè)我們使用 百兆寬帶,意味著網(wǎng)站出口的實(shí)際帶寬是8M左右,假設(shè)每個(gè)頁(yè)面是有10k,在這個(gè)并發(fā)的條件下,百兆帶寬已經(jīng)被吃完;
方案:CDN加速、負(fù)載均衡
QPS達(dá)到1000: 假設(shè)使用Redis緩存數(shù)據(jù)庫(kù)查詢數(shù)據(jù),每個(gè)頁(yè)面對(duì)Redis請(qǐng)求遠(yuǎn)大于直接對(duì)DB的請(qǐng)求;
Redis的悲觀并發(fā)數(shù)在5W左右,但有可能之前內(nèi)網(wǎng)帶寬已經(jīng)被吃光,表現(xiàn)出不穩(wěn)定;
方案:靜態(tài)HTML緩存
QPS達(dá)到2000: 文件系統(tǒng)訪問(wèn)鎖都成為了災(zāi)難;
方案:做業(yè)務(wù)分離,分布式存儲(chǔ);
高并發(fā)解決方案案例
流量?jī)?yōu)化: 防盜鏈處理(把一些惡意的請(qǐng)求拒之門外)
前端優(yōu)化: 減少HTTP請(qǐng)求、添加異步請(qǐng)求、啟用瀏覽器的緩存和文件壓縮、CDN加速、建立獨(dú)立的圖片服務(wù)器;
服務(wù)端優(yōu)化: 頁(yè)面靜態(tài)化處理、并發(fā)處理、隊(duì)列處理;
數(shù)據(jù)庫(kù)優(yōu)化: 數(shù)據(jù)庫(kù)的緩存、分庫(kù)分表、分區(qū)操作、讀寫分離、負(fù)載均衡
Web服務(wù)器優(yōu)化: 負(fù)載均衡
高并發(fā)下的經(jīng)驗(yàn)公式
通過(guò)QPS和PV計(jì)算部署服務(wù)器的臺(tái)數(shù)
單臺(tái)服務(wù)器每天PV計(jì)算
- 公式1:每天總PV = QPS * 3600 * 6
- 公式2:每天總PV = QPS * 3600 * 8
服務(wù)器計(jì)算
- 服務(wù)器數(shù)量 = ceil( 每天總PV / 單臺(tái)服務(wù)器每天總PV )
峰值QPS和機(jī)器計(jì)算公式
原理: 每天80%的訪問(wèn)集中在20%的時(shí)間里,這20%時(shí)間叫做峰值時(shí)間
公式: ( 總PV數(shù) * 80% ) / ( 每天秒數(shù) * 20% ) = 峰值時(shí)間每秒請(qǐng)求數(shù)(QPS)
機(jī)器: 峰值時(shí)間每秒QPS / 單臺(tái)機(jī)器的QPS = 需要的機(jī)器。
本文轉(zhuǎn)載自微信公眾號(hào)「冰河技術(shù)」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系冰河技術(shù)公眾號(hào)。