java random算法_负载均衡--随机算法(Random)
隨機(jī)算法是指:從服務(wù)器列表中,隨機(jī)選取一臺服務(wù)器進(jìn)行訪問。由概率論可以得知,隨著客戶端調(diào)用服務(wù)端的次數(shù)增多,其實(shí)際效果趨近于平均分配請求到服務(wù)端的每一臺服務(wù)器,也就是達(dá)到輪詢的效果。
一、算法描述
假設(shè)有 N 臺服務(wù)器 S = {S0, S1, S2, …, Sn},算法可以描述為:
1、通過隨機(jī)函數(shù)生成 0 到 N 之間的任意整理,將該數(shù)字作為索引,從 S 中獲取對應(yīng)的服務(wù)器;
假定我們現(xiàn)在有如下四臺服務(wù)器:
服務(wù)器地址權(quán)重192.168.1.11
192.168.1.22
192.168.1.33
192.168.1.44
初始化服務(wù)列表后, serverList 如下:
服務(wù)器地址序號192.168.1.11
192.168.1.22
192.168.1.23
192.168.1.34
隨機(jī)算法與服務(wù)器權(quán)重沒有關(guān)系,每個服務(wù)器會被隨機(jī)訪問到。當(dāng)調(diào)用次數(shù)足夠多時,每臺服務(wù)器被訪問的概率近似是相等的,隨機(jī)算法的效果就越趨近于輪詢算法。
二、java代碼實(shí)現(xiàn)
package com.test.mvp.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.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));
}
}
class RandomBalance {
private static final Random RANDOM = new Random();
private static ArrayList middleServerList;
public static String getServer() {
if (CollectionUtils.isEmpty(middleServerList)) {
Set serverSet = ServerManager.serverMap.keySet();
middleServerList = new ArrayList<>(serverSet);
}
return middleServerList.get(RANDOM.nextInt(middleServerList.size()));
}
}
public class RandomScheduleTest {
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));
});
}
}
運(yùn)算結(jié)果如下所示:
192.168.1.4, 第4臺server
192.168.1.3, 第3臺server
192.168.1.1, 第1臺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.1, 第1臺server
192.168.1.2, 第2臺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.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.3, 第3臺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.3, 第3臺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.1, 第1臺server
192.168.1.4, 第4臺server
192.168.1.2, 第2臺server
192.168.1.4, 第4臺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.1, 第1臺server
192.168.1.2, 第2臺server
192.168.1.2, 第2臺server
192.168.1.3, 第3臺server
192.168.1.1, 第1臺server
192.168.1.1, 第1臺server
192.168.1.1, 第1臺server
192.168.1.4, 第4臺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.1, 第1臺server
192.168.1.3, 第3臺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.3, 第3臺server
192.168.1.1, 第1臺server
192.168.1.1, 第1臺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.1, 第1臺server
192.168.1.3, 第3臺server
192.168.1.1, 第1臺server
192.168.1.4, 第4臺server
192.168.1.1, 第1臺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.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.2, 第2臺server
192.168.1.1, 第1臺server
192.168.1.3, 第3臺server
192.168.1.2, 第2臺server
192.168.1.1, 第1臺server
192.168.1.3, 第3臺server
192.168.1.4, 第4臺server
192.168.1.1, 第1臺server
192.168.1.1, 第1臺server
192.168.1.3, 第3臺server
192.168.1.1, 第1臺server
192.168.1.4, 第4臺server
192.168.1.3, 第3臺server
192.168.1.4, 第4臺server
192.168.1.2, 第2臺server
192.168.1.1, 第1臺server
192.168.1.2, 第2臺server
192.168.1.4, 第4臺server
192.168.1.4, 第4臺server
192.168.1.1, 第1臺server
192.168.1.3, 第3臺server
192.168.1.1, count:26
192.168.1.2, count:20
192.168.1.3, count:26
192.168.1.4, count:28
說明:
1、首先,使用 Random 對象隨機(jī)生成 [0, serverList.size()) 的整數(shù);然后,通過索引獲取到服務(wù)器。
2、在多線程的情況下,若線程A修改 ServerManager.serverMap 的值,則線程B無法即時拿到線程A修改后的值,可能會導(dǎo)致請求錯誤,需要調(diào)用方進(jìn)行容錯處理。
3、從宏觀的角度看,訪問量越大,負(fù)載越均衡。從微觀的角度看,局部并不那么均衡。
本文地址:https://blog.csdn.net/chinawangfei/article/details/109643598
如您對本文有疑問或者有任何想說的,請點(diǎn)擊進(jìn)行留言回復(fù),萬千網(wǎng)友為您解惑!
總結(jié)
以上是生活随笔為你收集整理的java random算法_负载均衡--随机算法(Random)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 永宏plc和台达vfd-m变頻器modb
- 下一篇: [生态建设] - js判断小技巧