摘要:我思考的是什么才算是高并發(fā)你一天幾個(gè)肯定高不了。所以我得出一個(gè)自定義概念如果某個(gè)系統(tǒng)的日在千萬(wàn)級(jí)別以上,他就可能是一個(gè)高并發(fā)的系統(tǒng)。高并發(fā)的問(wèn)題,我們具體該關(guān)心什么講真話(huà),高并發(fā)是個(gè)比較抽象的概念。是指秒鐘響應(yīng)的請(qǐng)求數(shù)量。
這并不是一個(gè)回答的問(wèn)題的文章,而是由此引發(fā)的一個(gè)思考。
大家心里仔細(xì)想想,當(dāng)你們聽(tīng)到高并發(fā)網(wǎng)站時(shí),心里對(duì)這個(gè)網(wǎng)站是個(gè)什么概念?首先想到的是淘寶嗎?帶著問(wèn)題,我們一起思考技術(shù)
寫(xiě)這個(gè)話(huà)題是因?yàn)槲覍?duì)搜索引擎給我的答案很不滿(mǎn)意,然后決定把思考的一些東西分享出來(lái),希望可以大家彼此討論下。
我們經(jīng)常在面試的時(shí)候,被問(wèn)到有沒(méi)有高并發(fā)的經(jīng)驗(yàn)?先不說(shuō)哪些考高并發(fā)的裝逼公司。我思考的是什么才算是高并發(fā)?你一天幾個(gè)pv肯定高不了。首先在網(wǎng)上查找一下,并未找到明確的標(biāo)準(zhǔn)定義。那么什么是并發(fā)呢?
并發(fā),在操作系統(tǒng)中,是指一個(gè)時(shí)間段中有幾個(gè)程序都處于已啟動(dòng)運(yùn)行到運(yùn)行完畢之間,且這幾個(gè)程序都是在同一個(gè)處理機(jī)上運(yùn)行,但任一個(gè)時(shí)刻點(diǎn)上只有一個(gè)程序在處理機(jī)上運(yùn)行。
摘自百度百科
我們說(shuō)的高并發(fā)是什么?上面的定義明顯不是我們通常所言的并發(fā),在互聯(lián)網(wǎng)時(shí)代,所講的并發(fā)、高并發(fā),通常是指并發(fā)訪問(wèn)。也就是在某個(gè)時(shí)間點(diǎn),有多少個(gè)訪問(wèn)同時(shí)到來(lái)。
我看到有人給高并發(fā)下了類(lèi)似的定義:
高并發(fā)通常是指我們提供的系統(tǒng)服務(wù)能夠同時(shí)并行處理很多請(qǐng)求。
來(lái)看看這個(gè)定義,這里首先把并發(fā)給混淆到并行了。關(guān)于并發(fā)并行的區(qū)別看這里,我就不多說(shuō),繼續(xù)探討并發(fā)。
然后定義又說(shuō)很多請(qǐng)求?什么叫很多請(qǐng)求?做為中國(guó)人,這個(gè)詞讓我想象力一發(fā)不可收拾......好了,拉回來(lái),繼續(xù)本文。
那么從上面的分析,可以看出來(lái)高并發(fā)在網(wǎng)絡(luò)上業(yè)界也沒(méi)有明確的定義。但根據(jù)我搜索情況,一般都是pv在千萬(wàn)級(jí)別以上的公司才會(huì)涉及到這個(gè)概念。所以我得出一個(gè)自定義概念:如果某個(gè)系統(tǒng)的日pv在千萬(wàn)級(jí)別以上,他就可能是一個(gè)高并發(fā)的系統(tǒng)。
為什么說(shuō)是可能?那是因?yàn)橛械墓就耆蛔呒夹g(shù)路線,全靠機(jī)器堆,這不在我們的討論范圍。
高并發(fā)的問(wèn)題,我們具體該關(guān)心什么?講真話(huà),高并發(fā)是個(gè)比較抽象的概念。很難有一個(gè)統(tǒng)一的可衡量的標(biāo)準(zhǔn)。哪么有一些其它維度的標(biāo)準(zhǔn)指標(biāo)來(lái)衡量系統(tǒng)的性能嗎?搬出以前計(jì)算機(jī)課程里邊的一些指標(biāo)來(lái)跟大家聊聊。
先聲明幾個(gè)概念,別打瞌睡。
QPS(TPS):每秒鐘 request/事務(wù) 數(shù)量,在互聯(lián)網(wǎng)領(lǐng)域,指每秒響應(yīng)請(qǐng)求數(shù)(指http請(qǐng)求);
吞吐量:?jiǎn)挝粫r(shí)間內(nèi)處理的請(qǐng)求數(shù)量(通常由QPS與并發(fā)數(shù)決定);
響應(yīng)時(shí)間:系統(tǒng)對(duì)一個(gè)請(qǐng)求做出響應(yīng)的平均時(shí)間。例如系統(tǒng)處理一個(gè)HTTP請(qǐng)求需要200ms,這個(gè)200ms就是系統(tǒng)的響應(yīng)時(shí)間(我認(rèn)為這里應(yīng)該僅包含處理時(shí)間,網(wǎng)絡(luò)傳輸時(shí)間忽略)。
這里一定要注意呃,QPS ≠ 并發(fā)數(shù)
并發(fā)是指,某個(gè)時(shí)刻有多少個(gè)訪問(wèn)同時(shí)到來(lái)。QPS是指秒鐘響應(yīng)的請(qǐng)求數(shù)量。那么這里就肯容易推算出一個(gè)公式:
QPS = 并發(fā)數(shù) / 平均響應(yīng)時(shí)間
后面我們的分析都是圍繞這個(gè)公示來(lái)進(jìn)行展開(kāi),沒(méi)明白的再回味一下。
現(xiàn)在我們來(lái)假設(shè)一個(gè)場(chǎng)景:既然QPS是每秒鐘處理的http請(qǐng)求數(shù)量。那么1s = 1000ms。假設(shè)我們當(dāng)前一個(gè)http請(qǐng)求服務(wù)器處理完成需要100ms(即那么 平均響應(yīng)時(shí)間 = 100ms )。那么它1s鐘可以處理10個(gè)請(qǐng)求。也就是說(shuō) qps = 10。推算出 并發(fā)數(shù) = 10
常常我們被問(wèn)到高并發(fā)的問(wèn)題,其實(shí)從某種程度上來(lái)說(shuō)是怎么提高現(xiàn)有程序的性能。現(xiàn)在我們基于上面的假設(shè),來(lái)進(jìn)行分析。假設(shè)現(xiàn)在有個(gè)系統(tǒng)性能上就是我們上面的假設(shè),它每天有 300萬(wàn)pv,運(yùn)行在單機(jī)上(當(dāng)然經(jīng)常宕機(jī)),按照上面的系統(tǒng)性能數(shù)據(jù),給出優(yōu)化解決方案。
提高并發(fā)能力通過(guò)上面的分析,要提升并發(fā)能力,我們就需要提升我們的qps(其實(shí)這里并不完全正確,為了說(shuō)明問(wèn)題,我們先放棄一部分正確性)
最快速解決方案,就是增加機(jī)器。我們根據(jù)以上情況來(lái)實(shí)際計(jì)算一下。
訪問(wèn)量:200w pv
QPS:10
根據(jù)日常經(jīng)驗(yàn),80% 的訪問(wèn)量集中在 20%的時(shí)間,算一下這 200w pv實(shí)際需要機(jī)器達(dá)到多少qps才能滿(mǎn)足。
qps = (200w * 0.8) / (24 * 3600 * 0.3) qps = 61.7
實(shí)際上如果在單機(jī)上,要求我們每秒鐘處理請(qǐng)求必須達(dá)到 61.7 以上才行,而實(shí)際上我們當(dāng)前系統(tǒng)的qps是 10。那么怎么解決?
方案一:上機(jī)器
個(gè)人的能力是有限的,團(tuán)隊(duì)的力量是無(wú)窮的。既然一臺(tái)機(jī)器搞不定,我們就多上幾臺(tái)機(jī)器。這就涉及到db主從、讀寫(xiě)分離、負(fù)載均衡等技術(shù)。
它的原理就是分流,把以前集中的壓力分散開(kāi)來(lái)。改方案見(jiàn)效快,靈活,實(shí)踐起來(lái)也更快。
方案二:增加單機(jī)性能
單機(jī)到底性能能夠增加到一個(gè)什么程度,這取決于你的機(jī)器配置,也取決于你的服務(wù)到底有多復(fù)雜。
ps: 寫(xiě)到這里突然有點(diǎn)能夠理解為什網(wǎng)上對(duì)高并發(fā)都是講很多請(qǐng)求,沒(méi)有具體數(shù)據(jù)了,因?yàn)檫@真的只能針對(duì)業(yè)務(wù)來(lái)講,100個(gè)并發(fā)對(duì)靜態(tài)網(wǎng)頁(yè)來(lái)說(shuō)根本沒(méi)有的事兒,但是對(duì)于某些密集計(jì)算型的估計(jì)...
那么常見(jiàn)的單機(jī)如何提升性能?比如:增加不常變化數(shù)據(jù)的緩存,開(kāi)啟php的opcache,優(yōu)化代碼(如:n+1問(wèn)題、多重嵌套循環(huán)、深層遞歸等),db表優(yōu)化等等。由于這些每一個(gè)點(diǎn)拿出來(lái)都?jí)驅(qū)懸槐緯?shū)了。咋就不繼續(xù)下去。
總結(jié)由于筆者自己也是沒(méi)有實(shí)際經(jīng)歷過(guò)kw級(jí)別pv場(chǎng)景,很多東西講的不一定對(duì),本文也是理清自己的一點(diǎn)思路。希望能夠與更多朋友進(jìn)行討論。
也希望本文能夠解決你的一點(diǎn)疑惑,讓我們能夠從高大上的概念落實(shí)到實(shí)際問(wèn)題中去。
參考資料并發(fā)和并行的區(qū)別
系統(tǒng)性能測(cè)試想個(gè)概念
GitHub:https://github.com/helei112g
我在github開(kāi)源了支付寶支付、微信支付、招商一網(wǎng)通支付的php sdk。希望能夠幫助你提升項(xiàng)目開(kāi)發(fā)的效率。項(xiàng)目地址
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/25703.html
本文是公眾號(hào)讀者jianfeng投稿的面試經(jīng)驗(yàn)恭喜該同學(xué)成功轉(zhuǎn)型目錄:毅然轉(zhuǎn)型,沒(méi)頭蒼蠅制定目標(biāo),系統(tǒng)學(xué)習(xí)面試經(jīng)歷毅然轉(zhuǎn)崗,沒(méi)頭蒼蠅首先,介紹一下我的背景。本人坐標(biāo)廣州,2016年畢業(yè)于一個(gè)普通二本大學(xué),曾經(jīng)在某機(jī)構(gòu)培訓(xùn)過(guò)Android。2018年初的時(shí)候已經(jīng)在兩家小公司工作干了兩年的android開(kāi)發(fā),然后會(huì)一些Tomcat、Servlet之類(lèi)的技術(shù),當(dāng)時(shí)的年薪大概也就15萬(wàn)這樣子。由于個(gè)人發(fā)展...
摘要:前端日?qǐng)?bào)精選組件規(guī)范個(gè)小模式工作機(jī)制引擎內(nèi)部機(jī)制及如何編寫(xiě)優(yōu)化代碼的個(gè)訣竅二進(jìn)制的從零學(xué)習(xí)技術(shù)棧系列教程中文框架設(shè)計(jì)第版之語(yǔ)言模塊掘金連載小程序?qū)崙?zhàn)文章視頻教程第一章小程序初級(jí)入門(mén)教程準(zhǔn)備掘金性能調(diào)優(yōu)之代碼篇三升級(jí)到知乎專(zhuān)欄原理 2017-08-25 前端日?qǐng)?bào) 精選 React組件規(guī)范10個(gè)React小模式JavaScript工作機(jī)制:V8 引擎內(nèi)部機(jī)制及如何編寫(xiě)優(yōu)化代碼的5個(gè)訣竅Ja...
摘要:由一層函數(shù)調(diào)用進(jìn)入下一層函數(shù)調(diào)用的遞推。此時(shí),中的一個(gè)稱(chēng)為孤兒的類(lèi)就會(huì)收留這個(gè)對(duì)象。禁止訪問(wèn)服務(wù)器拒絕請(qǐng)求服務(wù)器找不到請(qǐng)求的頁(yè)面服務(wù)器內(nèi)部錯(cuò)誤壞的網(wǎng)關(guān)一般是網(wǎng)關(guān)服務(wù)器請(qǐng)求后端服務(wù)時(shí),后端服務(wù)沒(méi)有按照協(xié)議正確返回結(jié)果。 持續(xù)更新。。。。 php 1. 簡(jiǎn)述 php 中的 autoload Autoload 的加載機(jī)制,當(dāng)通過(guò) new 來(lái)實(shí)例化一個(gè)類(lèi)時(shí),PHP 會(huì)通過(guò)定義的 autol...
閱讀 2882·2021-09-01 10:30
閱讀 1735·2019-08-30 15:52
閱讀 1045·2019-08-29 18:40
閱讀 1206·2019-08-28 18:30
閱讀 2451·2019-08-23 17:19
閱讀 1402·2019-08-23 16:25
閱讀 2803·2019-08-23 16:18
閱讀 3058·2019-08-23 13:53