负载均衡算法

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;
    }
}
相关推荐
民乐团扒谱机32 分钟前
【微实验】谐波乘积谱(HPS)算法深度解析:原理、数学与代码实现
开发语言·人工智能·python·算法·语音识别·音乐
Nil20836 分钟前
leetcode 73矩阵置0
算法·leetcode·矩阵
忍冬k2 小时前
DeepSeek harness安装指南
java·开发语言·数据结构·c++·算法
何以解忧,唯有..2 小时前
预订酒店问题
算法
No8g攻城狮2 小时前
【算法】什么是 DFS 与 BFS 及他们的区别
算法·深度优先·宽度优先
旖旎夜光3 小时前
LeetCode 1658:将 x 减到 0 的最小操作数(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口
zww89491113 小时前
家政派单系统实战指南:从需求分析到智能调度算法落地
算法·需求分析
手写码匠3 小时前
华为云Flexus+DeepSeek征文|Dify 多 Agent 评测实战:用 DeepSeek-R1 当裁判,打造多智能体系统的自动化质量保障体系
人工智能·深度学习·算法·aigc
ZC跨境爬虫3 小时前
LeetCode 88. 合并两个有序数组(双指针详解 + Java Python 实现)
java·python·算法·leetcode
Nil2083 小时前
leetcode 238除了自身以外数组的乘积
数据结构·算法·leetcode