QPS
題目
有一個消息隊列集群,集群里每臺Broker的響應(yīng)時間RT都不一樣,但是每臺Broker的極限服務(wù)QPS都是一樣的,超過這個QPS會出現(xiàn)過載雪崩。而消息的生產(chǎn)者客戶端,每次發(fā)送都會選擇其中的一臺broker來發(fā)送,一般來說發(fā)送邏輯是運行在一個線程池里面。假設(shè)cpu資源充足,通過實現(xiàn)一個負載均衡算法,使得生產(chǎn)者能夠達到最大吞吐量,最優(yōu)的平均響應(yīng)時間,但是又不能把任何一臺服務(wù)器壓垮。已知每個broker的rt、極限qps,消息生產(chǎn)者的線程數(shù)量,請求總數(shù),如果采用吞吐量最優(yōu)的算法,求處理完所有請求需要的耗時,單位毫秒。
概念說明:
QPS:query per second, 每秒請求量
RT:response time,請求的響應(yīng)時間(單位為ms)
Broker:消息隊列的服務(wù)器
背景知識
有一個重要的公式:
QPS(事務(wù)數(shù)/s)=并發(fā)數(shù)響應(yīng)時間(s)
每臺服務(wù)器都有一個最大的QPS,服務(wù)器的響應(yīng)時間的倒數(shù)是1臺客戶訪問時,每秒服務(wù)器可以處理的事務(wù)數(shù)。當(dāng)有多個客戶進行訪問的話,服務(wù)器就會開多個線程(進程),在每個線程(進程)中,響應(yīng)時間不會有太大變化(在客戶數(shù)不多的情況下),那么QPS就可以隨著并發(fā)數(shù)的增加而增加了。但凡事都有個度,當(dāng)并發(fā)數(shù)增加到一定時,響應(yīng)時間就會明顯增加了。線程(進程)變多了,服務(wù)器花費在調(diào)度上的時間比例就增加了。
在真實情況下,響應(yīng)時間可以根據(jù)業(yè)務(wù)情況進行估算。比如對于人們?yōu)g覽一個網(wǎng)站,響應(yīng)時間100ms和500ms是沒有區(qū)別的。根據(jù)QPS的公式,在服務(wù)器最大QPS不變的情況下,增大響應(yīng)時間可以增大并發(fā)數(shù),就是一臺服務(wù)器可以服務(wù)更多的客戶,從而減少服務(wù)器成本。
回到題目
題目中已經(jīng)給出了main()函數(shù),我們需要完成doneTime()函數(shù)。對于題目中給出的例子,共有10個線程,5個服務(wù)器。我原本以為只有一個客戶端,最多只能有10個線程,后來發(fā)現(xiàn)并不是這樣的。我們可以5個客戶端50個線程一起去訪問5個服務(wù)器。那么對于每個服務(wù)器,響應(yīng)時間和并發(fā)數(shù)都已知,那么QPS就可以計算出來,若QPS太大,就取QPS的上限。將5個QPS相加,就是這個集群的QPS。請求總數(shù)除以集群的QPS就是花費的時間。
按照自己的理解,畫出題目中的例子表達圖,有利于理解情景。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int maxQps= Integer.valueOf(in.nextLine());
final String[] rtList = in.nextLine().split(",");
final int requestNum = Integer.valueOf(in.nextLine());
final int threadNum = Integer.valueOf(in.nextLine());
System.out.println(doneTime(maxQps, rtList, requestNum, threadNum));
}
/**
* 如果使用最優(yōu)的最大吞吐量負載均衡算法,按照最優(yōu)模型多久能夠處理完所有請求,單位毫秒。
* @return
*/
static long doneTime(int maxQps,String[] rtList,int requestNum,int threadNum) {
//TODO
int qpsSum = 0;
for (String rtString : rtList) {
int singleMaxQps = threadNum * 1000 / Integer.valueOf(rtString);
if (singleMaxQps > maxQps) {
qpsSum += maxQps;
}else {
qpsSum += singleMaxQps;
}
}
return requestNum / qpsSum * 1000;
}
}
【Reference】
http://www.cnblogs.com/zhulin-jun/p/6597074.html
https://dearhwj.gitbooks.io/itbook/content/test/performance_test_qps_tps.html
總結(jié)
- 上一篇: js获取当前时间(昨天、今天、明天)
- 下一篇: java spring 拦截器_Spri