一道阿里的在線筆試題

如需轉載請留言。html

題目以下:java

有一個消息隊列集羣,集羣裏每臺Broker的響應時間RT都不同,可是每臺Broker的極限服務QPS都是同樣的,超過這個QPS會出現過載雪崩。而消息的生產者客戶端,每次發送都會選擇其中的一臺broker來發送,通常來講發送邏輯是運行在一個線程池裏面。假設cpu資源充足,經過實現一個負載均衡算法,使得生產者可以達到最大吞吐量,最優的平均響應時間,可是又不能把任何一臺服務器壓垮。已知每一個broker的rt、極限qps,消息生產者的線程數量,請求總數,若是採用吞吐量最優的算法,求處理完全部請求須要的耗時,單位毫秒。
概念說明:
QPS:query per second, 每秒請求量
RT:response time,請求的響應時間
Broker:消息隊列的服務器
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));
    }
    /**
     * 若是使用最優的最大吞吐量負載均衡算法,按照最優模型多久可以處理完全部請求,單位毫秒。
     * @return
     */
    static long doneTime(int maxQps,String[] rtList,int requestNum,int threadNum) {
        //TODO
                
        return 0;
    }
}

編譯器版本: Java 1.8.0_66 請使用標準輸入輸出(System.in, System.out);已禁用圖形、文件、網絡、系統相關的操做,如java.lang.Process , javax.swing.JFrame , Runtime.getRuntime;不要自定義包名稱,不然會報錯,即不要添加package answer之類的語句;您能夠寫不少個類,可是必須有一個類名爲Main,而且爲public屬性,而且Main爲惟一的public class,Main類的裏面必須包含一個名字爲'main'的靜態方法(函數),這個方法是程序的入口
時間限制: 30S (C/C++之外的語言爲: 32 S)   內存限制: 200M (C/C++之外的語言爲: 712 M)
輸入:輸入數據包含5行數字: 第一行是每臺broker的極限QPS 第二行是broker rt列表,用逗號分割,幾個rt表示幾個broker 第三行是消息生產請求總數 第四行是最大併發線程數
輸出:按照最大吞吐量執行完全部請求,須要耗時多少毫秒
輸入範例:200 1,1,1,10,10 5000 10
輸出範例:5000linux

 

首先,咱們要弄明白幾個概念。第一個,什麼叫最大吞吐量負載均衡算法。git

詳見:負載均衡幾種常見算法的簡單介紹web

並且,如題所需,咱們創建在「最優模型」下求解。因此,咱們忽略帶寬,節點信息等的限制,進入理想狀況。算法

 

接下來,咱們須要解決的問題,就是在理想狀況下,qps(query per second)和threadNum(線程數量),rt(響應時間)之間的關係。bash

詳見:qps,rt,threadNum的關係服務器

上面的資料連接裏,那張吞吐量與qps,threadNum的關係,以及qps=threadNum/rt,對本題都很關鍵。網絡

 

那麼答案已經顯而易見了。咱們也能理清題目中全部已知條件對最終結果的影響。那碼代碼就是分分鐘的事。併發

import java.util.Scanner;

/**
 * @author Feng_zhulin
 * @since 17/3/20
 */
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));
    }
    /**
     * 若是使用最優的最大吞吐量負載均衡算法,按照最優模型多久可以處理完全部請求,單位毫秒。
     * @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;
    }
}

簡單的寫法,隨手碼的,求不噴。

 

最後驗證一下:

Feng_zhulindeMacBook-Pro:Desktop Feng_zhulin$ java Main
200
12,11,13,20,50
40000
8
41000

 

Feng_zhulindeMacBook-Pro:Desktop Feng_zhulin$ java Main
200
1,1,1,10,10
5000
10
5000
相關文章
相關標籤/搜索