负载均衡算法

1、随机

java 复制代码
public class Test0119 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("A");
        list.add("B");
        list.add("C");

        for (int i = 0; i < 10; i++) {
            System.out.println(random(list));
        }
    }

    public static String random(List<String> list){
        int index = new Random().nextInt(list.size());
        return list.get(index);
    }
}

2、轮询

java 复制代码
public class Test0119 {
    static int index = 0;

    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("A");
        list.add("B");
        list.add("C");

        for (int i = 0; i < 10; i++) {
            System.out.println(roundRobin(list));
        }
    }

    public static String roundRobin(List<String> list){
        if(index < list.size()){
            return list.get(index++);
        } else{
            index = 1;
            return list.get(0);
        }
    }
}

3、加权轮询

  • 实现1
java 复制代码
public class Test0119 {
    static int index = 0;

    public static void main(String[] args) {
        Map<String, Integer> servers = new HashMap<>();
        servers.put("A", 2);
        servers.put("B", 3);
        servers.put("C", 5);
        for (int i = 0; i < 10; i++) {
            System.out.println(weightRoundRobin(servers));
        }
    }

    public static String weightRoundRobin(Map<String, Integer> servers){
        List<String> list = new ArrayList<>();
        for(String key : servers.keySet()){
            Integer value = servers.get(key);
            while(value-- != 0){
                list.add(key);
            }
        }

        if(index < list.size()){
            return list.get(index++);
        } else{
            index = 1;
            return list.get(0);
        }
    }
}
  • 实现2
java 复制代码
public class Test01191 {
    static int index = 0;

    public static void main(String[] args) {
        Map<String, Integer> servers = new HashMap<>();
        servers.put("A", 2);
        servers.put("B", 3);
        servers.put("C", 5);
        for (int i = 0; i < 10; i++) {
            System.out.println(weightRoundRobin(i, servers));
        }
    }

    public static String weightRoundRobin(int i, Map<String, Integer> servers){
        for(String key : servers.keySet()){
            Integer value = servers.get(key);
            if(i < value){
                return key;
            } else{
                i -= value;
            }
        }

        return "";
    }
}

4、加权随机

  • 实现1
java 复制代码
public class Test01191 {

    public static void main(String[] args) {
        Map<String, Integer> servers = new HashMap<>();
        servers.put("A", 2);
        servers.put("B", 3);
        servers.put("C", 5);
        for (int i = 0; i < 10; i++) {
            System.out.println(weightRandom(servers));
        }
    }

    public static String weightRandom(Map<String, Integer> servers){
        List<String> list = new ArrayList<>();
        for(String key : servers.keySet()){
            Integer value = servers.get(key);
            while(value-- != 0){
                list.add(key);
            }
        }

        int index = new Random().nextInt(list.size());
        return list.get(index);
    }
}

5、平滑加权轮询

  • 固定权限:weight(2,3,5)
  • 动态变化权限:currWeight(0,0,0)
currWeight += weight max(currWeight) result max(currWeight) -= sum(weight)
2、3、5 5 C 2、3、-5
4、6、0 6 B 4、-4、0
6、-1、5 6 A -4、-1、5
-2、2、10 10 C -2、2、0
0、5、5 5 B 0、-5、5
2、-2、10 10 C 2、-2、0
4、1、5 5 C 4、1、-5
6、4、0 6 A -4、4、0
-2、7、5 7 B -2、-3、5
0、0、10 10 C 0、0、0

解释:

先使用currWeight加上weight,比如第一行结果是2、3、5,然后取得currWeight最大值是5,数字5正好位于2、3、5的第三位,属于C服务器,接着将max(currWeight)减去weight之和,变成2、3、-5。执行结果变成新的currWeight,开始第二行。

第二行,currWeight加上weight变成4、6、0,重复上面的过程,直至最后的currWeight归零,10次会归零,因为2+3+5=10。然后循环往复。

java 复制代码
public class Test01191 {

    public static void main(String[] args) {
        int sum = 10;

        Map<String, Integer> servers = new HashMap<>();
        servers.put("A", 2);
        servers.put("B", 3);
        servers.put("C", 5);

        List<String> serverList = Arrays.asList("A", "B", "C");

        List<Integer> weight = new ArrayList<>();
        for(String key: servers.keySet()){
            weight.add(servers.get(key));
        }
        List<Integer> currWeight = Arrays.asList(0, 0, 0);

        for (int i = 0; i < 10; i++) {
            add(weight, currWeight);
            Map<Integer, String> map = find(currWeight, serverList, sum);
            for(Integer key : map.keySet()){
                System.out.println(map.get(key));
            }
        }

    }

    public static void add(List<Integer> weight, List<Integer> currWeight){
        for(int i = 0; i<weight.size(); i++){
            currWeight.set(i, currWeight.get(i) + weight.get(i));
        }
    }

    public static Map<Integer, String> find(List<Integer> currWeight, List<String> serverList, int sum){
        Map<Integer, String> map = new HashMap<>();
        int max = -1;
        int index = -1;

        for(int i=0; i<currWeight.size(); i++){
            if(currWeight.get(i) > max){
                max = currWeight.get(i);
                index = i;
            }
        }

        currWeight.set(index, currWeight.get(index) - sum);
        map.put(max, serverList.get(index));
        return map;
    }
}
相关推荐
嵌入式小能手2 小时前
飞凌嵌入式ElfBoard-系统信息与资源之休眠
c语言·开发语言·算法
历程里程碑2 小时前
哈希3 : 最长连续序列
java·数据结构·c++·python·算法·leetcode·tornado
闻缺陷则喜何志丹2 小时前
【图论】P9661 [ICPC 2021 Macao R] Sandpile on Clique|普及+
c++·算法·图论·洛谷
2401_841495642 小时前
【LeetCode刷题】两两交换链表中的节点
数据结构·python·算法·leetcode·链表·指针·迭代法
傻啦嘿哟2 小时前
构建命令行单词记忆工具:JSON词库与复习算法的完美结合
算法·json
mjhcsp2 小时前
一种新的LCA算法
算法
wen__xvn3 小时前
代码随想录算法训练营DAY24第七章 回溯算法part03
算法·深度优先
无尽的罚坐人生3 小时前
hot 100 560.和为 K 的子数组
数据结构·算法·leetcode
Ll13045252983 小时前
leetcode代码随想录数组篇
数据结构·算法·leetcode