美文网首页
SLB - 加权轮询法(Weight Round Robin)

SLB - 加权轮询法(Weight Round Robin)

作者: Skymiles | 来源:发表于2019-06-08 12:10 被阅读0次

加权轮询(Weight Round Robin)法
不同的后端服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不相同。给配置高、负载低的机器配置更高的权重,让其处理更多的请;而配置低、负载高的机器,给其分配较低的权重,降低其系统负载,加权轮询能很好地处理这一问题,并将请求顺序且按照权重分配到后端。
加权轮询法的代码实现大致如下:

public class IPMap {
    // 待路由的Ip列表,Key代表Ip,Value代表该Ip的权重
    public static final HashMap<String, Integer> serverWeightMap = new HashMap<String, Integer>();

    static {
        // 权重为1,2,4
        serverWeightMap.put("192.168.13.1", 1);
        serverWeightMap.put("192.168.13.2", 2);
        serverWeightMap.put("192.168.13.3", 4);
    }
}


/**
 * 加权轮询(Weight Round Robin)法
 *
 * 不同的服务器可能机器配置和当前系统的负载并不相同,因此它们的抗压能力也不尽相 同,给配置高、负载低的机器配置更高的权重,让其处理更多的请求,而低配置、高负载的机器,则给其分配较低的权重,降低其系统负载。加权轮询法可以很好地 处理这一问题,并将请求顺序按照权重分配到后端。加权轮询法的代码实现大致如下:
 */
public class WeightRoundRobin {

    private static AtomicInteger pos = new AtomicInteger(0);

    public static String getServer() {
        // 重建一个Map,避免服务器的上下线导致的并发问题
        HashMap<String, Integer> serverMap = new HashMap<String, Integer>();
        serverMap.putAll(IPMap.serverWeightMap);
        ArrayList<String> serverList = new ArrayList<String>();

        Set<String> ipSet = serverMap.keySet();
        for (String ip : ipSet) {
            Integer weight = serverMap.get(ip);
            for (int i = 0; i < weight; i++) {
                serverList.add(ip);
            }
        }

        pos.set(pos.get() % serverList.size());
        return serverList.get(pos.getAndIncrement());
    }
}



测试如下

for (int i = 0; i < 14; ++i) {
    System.out.println(WeightRoundRobin.getServer());
}

结果:

测试.png

相关文章

网友评论

      本文标题:SLB - 加权轮询法(Weight Round Robin)

      本文链接:https://www.haomeiwen.com/subject/kqcixctx.html