负载均衡算法--随机法(Random)

接上一篇博文:负载均衡算法–加权轮询法(Weight Round Robin),本文讲解随机算法。

通过随机算法从服务器列表中随机选取一台服务器进行访问。由概率论可以得知,随着客户端调用服务端的次数增多,其实际效果趋近于平均分配请求到服务端的每一台服务器,也就是达到轮询的效果。

算法描述

假设有 N 台服务器 S = {S0, S1, S2, …, Sn},算法可以描述为:
1、通过随机函数生成 0 到 N 之间的任意整理,将该数字作为索引,从 S 中获取对应的服务器;

假定我们现在有如下四台服务器:

服务器地址 权重
192.168.1.1 1
192.168.1.2 2
192.168.1.3 3
192.168.1.4 4

初始化服务列表后, serverList 如下:

服务器地址 序号
192.168.1.1 1
192.168.1.2 2
192.168.1.2 3
192.168.1.3 4

随机算法与服务器权重没有关系,每个服务器会被随机的访问到,由概率论可以得知,当样本量足够大时,每台服务器被访问到的几率近似是相等的,随机算法的效果就越趋近于轮询算法。

代码实现

1、服务器管理类

package org.learn.loadbalance;

import java.util.Map;
import java.util.TreeMap;

/**
 * @author zhibo
 * @date 2019/5/16 16:25
 */
public class ServerManager {
    public volatile static Map<String, Integer> serverMap = new TreeMap<>();

    static {
        serverMap.put("192.168.1.1", 1);
        serverMap.put("192.168.1.2", 2);
        serverMap.put("192.168.1.3", 3);
        serverMap.put("192.168.1.4", 4);
    }
}

2、随机类

package org.learn.loadbalance;

import java.util.ArrayList;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author zhibo
 * @date 2019/5/16 16:28
 */
public class RandomBalance {

    public static String getServer() {
        Set<String> serverSet = ServerManager.serverMap.keySet();
        ArrayList<String> serverList = new ArrayList<>(serverSet);

        Random random = new Random();
        String server = serverList.get(random.nextInt(serverList.size()));
        return server;
    }

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            String server = getServer();
            System.out.println(server);
        }
    }
}

1、使用 Random 对象随机生成 [0, serverList.size()) 的整数,然后通过索引获取到服务器。
2、在多线程的情况下, 线程A修改 ServerManager.serverMap 的值,线程B无法即时拿到线程A修改后的值,因此可能会产生请求错误,需要调用端进行容错处理。
3、从宏观的角度讲,访问量越大负载越均衡;微观的角度讲,看起来没有那么均衡。

执行 main 方法输出结果如下:
在这里插入图片描述

文章内容仅代表个人观点,如有不正之处,欢迎批评指正,谢谢大家。

发布了179 篇原创文章 · 获赞 296 · 访问量 164万+

猜你喜欢

转载自blog.csdn.net/claram/article/details/90271085