加權(quán)輪詢(Weight Round Robin)法
不同的后端服務(wù)器可能機(jī)器的配置和當(dāng)前系統(tǒng)的負(fù)載并不相同,因此它們的抗壓能力也不相同疤剑。給配置高洛波、負(fù)載低的機(jī)器配置更高的權(quán)重,讓其處理更多的請骚露;而配置低蹬挤、負(fù)載高的機(jī)器,給其分配較低的權(quán)重棘幸,降低其系統(tǒng)負(fù)載焰扳,加權(quán)輪詢能很好地處理這一問題,并將請求順序且按照權(quán)重分配到后端误续。
加權(quán)輪詢法的代碼實現(xiàn)大致如下:
public class IPMap {
// 待路由的Ip列表吨悍,Key代表Ip,Value代表該Ip的權(quán)重
public static final HashMap<String, Integer> serverWeightMap = new HashMap<String, Integer>();
static {
// 權(quán)重為1,2,4
serverWeightMap.put("192.168.13.1", 1);
serverWeightMap.put("192.168.13.2", 2);
serverWeightMap.put("192.168.13.3", 4);
}
}
/**
* 加權(quán)輪詢(Weight Round Robin)法
*
* 不同的服務(wù)器可能機(jī)器配置和當(dāng)前系統(tǒng)的負(fù)載并不相同蹋嵌,因此它們的抗壓能力也不盡相 同育瓜,給配置高、負(fù)載低的機(jī)器配置更高的權(quán)重栽烂,讓其處理更多的請求躏仇,而低配置恋脚、高負(fù)載的機(jī)器,則給其分配較低的權(quán)重焰手,降低其系統(tǒng)負(fù)載糟描。加權(quán)輪詢法可以很好地 處理這一問題,并將請求順序按照權(quán)重分配到后端书妻。加權(quán)輪詢法的代碼實現(xiàn)大致如下:
*/
public class WeightRoundRobin {
private static AtomicInteger pos = new AtomicInteger(0);
public static String getServer() {
// 重建一個Map船响,避免服務(wù)器的上下線導(dǎo)致的并發(fā)問題
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());
}
結(jié)果:
測試.png