java实现加权随机,负载均衡--加权随机算法(Weight Random)
加权随机法根据服务器的配置和系统的负载,分配不同的权重,按照权重随机请求后端服务器。一、算法描述假设有 N 台服务器 S = {S0, S1, S2, …, Sn},权重为 W = {W0, W1, W2, …, Wn},权重之和为 weightSum, 服务器列表为 serverList,算法可以描述为:1、初始化 serverList,将 W0 个 S0 加入至serverList,将 W1
加权随机法根据服务器的配置和系统的负载,分配不同的权重,按照权重随机请求后端服务器。
一、算法描述
假设有 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.11
192.168.1.22
192.168.1.33
192.168.1.44
初始化服务列表后, serverList 如下:
服务器地址序号192.168.1.11
192.168.1.22
192.168.1.23
192.168.1.34
192.168.1.35
192.168.1.36
192.168.1.47
192.168.1.48
192.168.1.49
192.168.1.410
首先,根据权重的不同,向 serverList 添加相应个数的服务器;然后,通过随机算法,随机获取访问的服务器。
二、java代码实现
package com.yidian.wemedia.civilization.schedulealgothrim;
import com.google.common.collect.SortedMultiset;
import com.google.common.collect.TreeMultiset;
import org.apache.commons.collections4.CollectionUtils;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.TreeMap;
class Server implements Serializable {
private static final long serialVersionUID = 7246747589293111189L;
private String server;
private Integer weight;
private String description;
public Server(String server, String description, Integer weight) {
this.server = server;
this.description = description;
this.weight = weight;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getServer() {
return server;
}
public void setServer(String server) {
this.server = server;
}
public Integer getWeight() {
return weight;
}
public void setWeight(Integer weight) {
this.weight = weight;
}
}
class ServerManager {
public static Map serverMap = new TreeMap<>();
static {
serverMap.put("192.168.1.1", new Server("192.168.1.1", "第1台server", 1));
serverMap.put("192.168.1.2", new Server("192.168.1.2", "第2台server", 2));
serverMap.put("192.168.1.3", new Server("192.168.1.3", "第3台server", 3));
serverMap.put("192.168.1.4", new Server("192.168.1.4", "第4台server", 4));
serverMap.put("192.168.1.5", new Server("192.168.1.5", "第4台server", 0));
}
}
class RandomBalance {
private static final Random RANDOM = new Random();
private static ArrayList middleServerList;
private static Integer weightSum = 0;
public static String getServer() {
if (CollectionUtils.isEmpty(middleServerList)) {
ArrayList serverList = new ArrayList<>();
Integer tempWeightSum = 0;
Set serverSet = ServerManager.serverMap.keySet();
for (String server : serverSet) {
Integer weight = ServerManager.serverMap.get(server).getWeight();
tempWeightSum += weight;
for (int i = 0; i < weight; i++) {
serverList.add(server);
}
}
middleServerList = serverList;
weightSum = tempWeightSum;
}
return middleServerList.get(RANDOM.nextInt(weightSum));
}
}
public class WeightRandomScheduleTest {
public static void main(String[] args) {
SortedMultiset serverSet = TreeMultiset.create();
for (int i = 0; i < 100; i++) {
String server = RandomBalance.getServer();
Server curServer = ServerManager.serverMap.get(server);
System.out.println(server + ", " + curServer.getDescription());
serverSet.add(server, 1);
}
ServerManager.serverMap.forEach((key, value)->{
System.out.println(key + ", count:" + serverSet.count(key));
});
}
}
运行结果如下所示:
192.168.1.4, 第4台server
192.168.1.4, 第4台server
192.168.1.2, 第2台server
192.168.1.4, 第4台server
192.168.1.3, 第3台server
192.168.1.2, 第2台server
192.168.1.3, 第3台server
192.168.1.2, 第2台server
192.168.1.1, 第1台server
192.168.1.4, 第4台server
192.168.1.4, 第4台server
192.168.1.3, 第3台server
192.168.1.3, 第3台server
192.168.1.4, 第4台server
192.168.1.4, 第4台server
192.168.1.3, 第3台server
192.168.1.3, 第3台server
192.168.1.4, 第4台server
192.168.1.2, 第2台server
192.168.1.3, 第3台server
192.168.1.4, 第4台server
192.168.1.3, 第3台server
192.168.1.4, 第4台server
192.168.1.3, 第3台server
192.168.1.3, 第3台server
192.168.1.4, 第4台server
192.168.1.4, 第4台server
192.168.1.3, 第3台server
192.168.1.2, 第2台server
192.168.1.1, 第1台server
192.168.1.4, 第4台server
192.168.1.4, 第4台server
192.168.1.3, 第3台server
192.168.1.4, 第4台server
192.168.1.4, 第4台server
192.168.1.1, 第1台server
192.168.1.4, 第4台server
192.168.1.4, 第4台server
192.168.1.4, 第4台server
192.168.1.3, 第3台server
192.168.1.4, 第4台server
192.168.1.1, 第1台server
192.168.1.4, 第4台server
192.168.1.2, 第2台server
192.168.1.2, 第2台server
192.168.1.4, 第4台server
192.168.1.3, 第3台server
192.168.1.4, 第4台server
192.168.1.3, 第3台server
192.168.1.4, 第4台server
192.168.1.1, 第1台server
192.168.1.3, 第3台server
192.168.1.3, 第3台server
192.168.1.2, 第2台server
192.168.1.3, 第3台server
192.168.1.4, 第4台server
192.168.1.1, 第1台server
192.168.1.3, 第3台server
192.168.1.2, 第2台server
192.168.1.2, 第2台server
192.168.1.4, 第4台server
192.168.1.2, 第2台server
192.168.1.4, 第4台server
192.168.1.1, 第1台server
192.168.1.2, 第2台server
192.168.1.2, 第2台server
192.168.1.4, 第4台server
192.168.1.4, 第4台server
192.168.1.4, 第4台server
192.168.1.3, 第3台server
192.168.1.1, 第1台server
192.168.1.2, 第2台server
192.168.1.2, 第2台server
192.168.1.3, 第3台server
192.168.1.4, 第4台server
192.168.1.3, 第3台server
192.168.1.4, 第4台server
192.168.1.3, 第3台server
192.168.1.3, 第3台server
192.168.1.4, 第4台server
192.168.1.2, 第2台server
192.168.1.3, 第3台server
192.168.1.4, 第4台server
192.168.1.4, 第4台server
192.168.1.1, 第1台server
192.168.1.2, 第2台server
192.168.1.4, 第4台server
192.168.1.2, 第2台server
192.168.1.2, 第2台server
192.168.1.3, 第3台server
192.168.1.4, 第4台server
192.168.1.4, 第4台server
192.168.1.4, 第4台server
192.168.1.4, 第4台server
192.168.1.4, 第4台server
192.168.1.4, 第4台server
192.168.1.2, 第2台server
192.168.1.3, 第3台server
192.168.1.1, 第1台server
192.168.1.3, 第3台server
192.168.1.1, count:10
192.168.1.2, count:20
192.168.1.3, count:28
192.168.1.4, count:42
192.168.1.5, count:0
说明:
1、首先,使用 Random 对象随机生成 [0, weightSum) 的整数;然后,通过索引获取到服务器。weightSum其实就是serverList.size()。
2、在多线程的情况下,若线程A修改 ServerManager.serverMap 的值,则线程B无法即时拿到线程A修改后的值,可能会导致请求错误,需要调用方进行容错处理。
3、从宏观的角度看,访问量越大,负载越均衡。从微观的角度看,局部并不那么均衡。
本文地址:https://blog.csdn.net/chinawangfei/article/details/109646579
如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)