又是周末,願大家開心。今天不寫復雜文章,來聊點簡單有趣的,探討下QPS(Query Per Second)和並發數的關系。
就我的個人經驗而言,很多人在工作中對這兩個概念一知半解,也有很多人在面試時回答得模棱兩可,不太應該哦。
多年前,在面試阿里巴巴時,遇到了一個開放性問題:
假設超市每分鍾有10個人走出來,請估算超市里面有多少人?
是不是感覺手足無措呢?嗯,可能如此。其實,這個問題沒有標准答案,關鍵還是考查思路。
我們先看一個有趣的定律,即Little's Law,如下:
在一個穩定的系統中,設長時間觀察到的平均顧客數量為L,長時間觀察到的有效到達速率為λ,平均每個顧客在系統中花費的時間是W,則有如下關系式:
L = λW
Little's Law的理解
假設有一水管,橫截面積為2平方米,水速為5米/秒,即水的流量速度是10立方米/秒,很顯然:
在長度100米的水管內,水量為200立方米,每滴水從流入到流出,耗時20秒,而水的流量速度是10立方米/秒。
也就是說,在這段水管中:
水量= 耗時 * 流量速度
這就是Little's Law. 雖然很早就意識到了這一關系式,但畢業后才第一次聽說Little's Law.
Little's Law的應用
Little's Law模型很通用,因此,在很多場景中都能得到應用,比如工業界和計算機界,都會有意或無意用到該定律。
先看一個最好懂的例子:大一新生的招收速度是5000人/年,每個學生在大學停留4年,因此,整個大學的人數就是20000.
接下來,看看騰訊公司的一道筆試題目,簡單但難倒不少人:
某互聯網產品(例如,一款網絡游戲)同時在線曲線(Average Concurrency Users,ACU)24小時數據如下圖所示。
現已知全天平均在線人數為5000人,玩家每次登陸后平均在線時長為2小時。請你估計一下,平均每分鍾約有多少玩家登錄。
這個題目中的圖是多余的,有誤導性。很顯然,根據Little's Law,答案是42.
QPS和並發數的關系
在后台開發中,經常要涉及到QPS和並發數的概念。在很多場景下都需要進行壓力測試,所以,有必要弄清它們之間的關系。
QPS和並發數的概念容易混淆,比如:1秒內並發地來了100個請求,這個100是QPS還是並發數? 來看看它們的含義:
QPS: 請求進入的速度
並發數: 系統中同時存在的請求數
根據Little's Law,我們能得到如下的關系式:
並發數 = QPS * 耗時
以大學招生為例:大一新生的招收速度是5000人/年,每個學生在大學停留4年,整個大學的人數是20000,於是(下面的QPS改為以年為單位):
QPS | 耗時 | 並發數 |
5000人/年 | 4年 | 20000人 |
以某公司為例:180000員工,必須早上8:30-9:00之間在考勤系統簽到,每次簽到在系統需要停留0.1秒,於是:
QPS | 耗時 | 並發數 |
100人/秒 | 0.1秒 | 10人 |
以動物園為例:每秒有1個人進入動物園,每個人在動物園中停留2小時,於是:
QPS | 耗時 | 並發數 |
1人/秒 | 2*3600秒 | 7200人 |
假設在理想情況下,某系統的請求進入速度是1億次/秒,系統處理的時間趨近為0,那么這個系統的並發量是多少呢?很顯然:
QPS | 耗時 | 並發數 |
1億次/秒 | 趨近0 | 趨近0次 |
可見,雖然每秒有1億次請求,但在某一隨機時刻觀察系統,會發現系統中不存在請求堆積的問題,系統的並發數趨近0.這是一個高QPS、低延時系統,是一個很好的系統,輕輕松松地快速處理各種請求,來一個滅一個。值得一提的是,此時並發數很低,但這不表明系統實際能夠承受的並發數很低,它實際上可能承受很高的並發數
最近,我對某系統進行了壓測,得到的數據如下(數據已經脫敏),滿足Little's Law:並發數 = QPS * avg
到此為止,應該清楚了QPS和並發數的關系,以后在開發或壓測時,再也不會懵圈了。