计算机系统应用教程网站

网站首页 > 技术文章 正文

平滑加权轮询

btikc 2024-08-29 12:22:28 技术文章 30 ℃ 0 评论

假设我们有3台机器,并配上相应的权重:IPA:5, IPB:1,IPC:1。

public class ServerIps {
    public static final Map<String, Integer> MAP_LIST = new HashMap<>();
    static {
        MAP_LIST.put("IPA",5);
        MAP_LIST.put("IPB",1);
        MAP_LIST.put("IPC",1);
    }
} 

定义权重类

public class Weight {
  //固定权重
    private Integer weight;
  //当前权重
    private Integer curWeight;
    private String ip;

    public Weight(Integer weight, Integer curWeight, String ip) {
        this.weight = weight;
        this.curWeight = curWeight;
        this.ip = ip;
    }
  //省略get与set
}

平滑加权轮询

public class RoundRobin {
    private static Map<String, Weight> weightMap = new HashMap<>();
    public static String getServer(){
        int totalWeight = ServerIps.MAP_LIST.values().stream().reduce(0,(w1,w2) -> w1 + w2);
        if(weightMap.isEmpty()){
            for (String ip: ServerIps.MAP_LIST.keySet()) {
                Integer weight = ServerIps.MAP_LIST.get(ip);
                weightMap.put(ip,new Weight(weight,weight,ip));
            }
        }
        Weight maxCurWeight = null;
        for(Weight weight : weightMap.values()){
            if(maxCurWeight == null || weight.getCurWeight() > maxCurWeight.getCurWeight()){
                maxCurWeight = weight;
            }
        }
        maxCurWeight.setCurWeight(maxCurWeight.getCurWeight() - totalWeight);
        for(Weight weight : weightMap.values()){
            weight.setCurWeight(weight.getCurWeight() + weight.getWeight());
        }
        return maxCurWeight.getIp();
    }
		//测试
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            System.out.println(getServer());
        }
    }
}

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表