负载均衡算法

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;
    }
}
相关推荐
西安邮电大学5 分钟前
有关栈的经典算法题
java·后端·其他·算法·面试
h_a_o777oah17 分钟前
【算法专项】扩展域并查集:原理详解及解决大部分种类并查集问题(洛谷P5937 P2024 C++代码)
数据结构·c++·算法·acm·并查集·扩展域·逻辑建模
兰令水37 分钟前
leecodecode【单调栈】【2026.6.12打卡-java版本】
java·开发语言·算法
TMT星球1 小时前
魔法原子上交会首秀VLA K02大模型,完成具身智能从“执行”到“理解”的能力跃迁
人工智能·算法·机器学习
2301_764441331 小时前
番茄钟+AI:高效专注的秘密武器
人工智能·算法·数学建模·动态规划·交互
影寂ldy1 小时前
C# 泛型委托
java·算法·c#
星马梦缘1 小时前
算法设计与分析 作业三 纯答案
算法
不知名的老吴2 小时前
经典算法题之行星碰撞
数据结构·算法
西安邮电大学2 小时前
有关数组的经典算法题
java·后端·其他·算法·面试
学Linux的语莫2 小时前
大模型微调数据集格式详解:Alpaca、ShareGPT、DPO、KTO、预训练数据怎么构建?
人工智能·算法·机器学习·微调格式