加权轮询(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());
}
结果:
网友评论