负载均衡算法--加权随机法(Weight Random)
Posted 志波同学
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了负载均衡算法--加权随机法(Weight Random)相关的知识,希望对你有一定的参考价值。
接上一篇博文:负载均衡算法–随机法(Random),本文讲解加权随机算法。
与加权轮询法一样,加权随机法也根据服务器的配置,系统的负载分配不同的权重。不同的是,它是按照权重随机请求后端服务器,而非顺序。
算法描述
假设有 N 台服务器 S = S0, S1, S2, …, Sn,默认权重为 W = W0, W1, W2, …, Wn,权重之和为 weightSum, 服务器列表为 serverList,算法可以描述为:
1、初始化 serverList,将 W0 个 S0 加入至serverList,将 W1 个 S1 加入至serverList,依据此规则将所有的服务器加入至 serverList 中;
2、通过随机函数生成 0 到 weightSum 之间的任意整理,将该数字作为索引,从 serverList 中获取对应的服务器;
假定我们现在有如下四台服务器:
服务器地址 | 权重 |
---|---|
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 |
192.168.1.3 | 5 |
192.168.1.3 | 6 |
192.168.1.4 | 7 |
192.168.1.4 | 8 |
192.168.1.4 | 9 |
192.168.1.4 | 10 |
与加权轮询算法类似,根据权重的不同向 serverList 添加相应的服务器,只不过服务器是通过随机算法获取的。
代码实现
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.Iterator;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @author zhibo
* @date 2019/5/16 16:28
*/
public class WeightRandom
public static String getServer()
ArrayList<String> serverList = new ArrayList<>();
Set<String> serverSet = ServerManager.serverMap.keySet();
Iterator<String> iterator = serverSet.iterator();
Integer weightSum = 0;
while(iterator.hasNext())
String server = iterator.next();
Integer weight = ServerManager.serverMap.get(server);
weightSum += weight;
for (int i = 0; i < weight; i++)
serverList.add(server);
Random random = new Random();
String server = serverList.get(random.nextInt(weightSum));
return server;
public static void main(String[] args)
for (int i = 0; i < 20; i++)
String server = getServer();
System.out.println(server);
1、使用 Random 对象随机生成 [0, serverList.size()) 的整数,然后通过索引获取到服务器。
2、在多线程的情况下, 线程A修改 ServerManager.serverMap 的值,线程B无法即时拿到线程A修改后的值,因此可能会产生请求错误,需要调用端进行容错处理。
3、从宏观的角度讲,访问量越大负载越均衡;微观的角度讲,看起来没有那么均衡。
执行 main 方法输出结果如下:
文章内容仅代表个人观点,如有不正之处,欢迎批评指正,谢谢大家。
以上是关于负载均衡算法--加权随机法(Weight Random)的主要内容,如果未能解决你的问题,请参考以下文章
负载均衡算法--加权轮询法(Weight Round Robin)