负载均衡算法

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;
    }
}
相关推荐
Old Uncle Tom1 天前
OpenClaw 记忆系统 -- 记忆预加载
java·数据结构·算法·agent
会编程的土豆1 天前
洛谷题单入门1 顺序结构
数据结构·算法·golang
生信碱移1 天前
PACells:这个方法可以鉴定疾病/预后相关的重要细胞亚群,作者提供的代码流程可以学习起来了,甚至兼容转录组与 ATAC 两种数据类型!
人工智能·学习·算法·机器学习·数据挖掘·数据分析·r语言
智者知已应修善业1 天前
【51单片机中的打飞机设计】2023-8-25
c++·经验分享·笔记·算法·51单片机
智者知已应修善业1 天前
【51单片机按键调节占空比3位数码管显示】2023-8-24
c++·经验分享·笔记·算法·51单片机
.5481 天前
## Sorting(排序算法)
python·算法·排序算法
wuweijianlove1 天前
算法的平均复杂度建模与性能回归分析的技术7
算法·数据挖掘·回归
子琦啊1 天前
【算法复习】字符串 | 两个底层直觉,吃透高频题
linux·运维·算法
code_pgf1 天前
Octo 算法详解-开源通用机器人策略模型技术报告
算法·机器人·开源
嘻嘻哈哈樱桃1 天前
牛客经典101题题解集--动态规划
java·数据结构·python·算法·职场和发展·动态规划