一道阿里的在線筆試題


如需轉載請留言。

題目如下:

有一個消息隊列集群,集群里每台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
輸出范例:5000

 

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

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

而且,如題所需,我們建立在“最優模型”下求解。所以,我們忽略帶寬,節點信息等的限制,進入理想情況。

 

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

詳見: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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM