java random算法_负载均衡--随机算法(Random)
隨機算法是指:從服務器列表中,隨機選取一臺服務器進行訪問。由概率論可以得知,隨著客戶端調用服務端的次數增多,其實際效果趨近于平均分配請求到服務端的每一臺服務器,也就是達到輪詢的效果。
一、算法描述
假設有 N 臺服務器 S = {S0, S1, S2, …, Sn},算法可以描述為:
1、通過隨機函數生成 0 到 N 之間的任意整理,將該數字作為索引,從 S 中獲取對應的服務器;
假定我們現在有如下四臺服務器:
服務器地址權重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
隨機算法與服務器權重沒有關系,每個服務器會被隨機訪問到。當調用次數足夠多時,每臺服務器被訪問的概率近似是相等的,隨機算法的效果就越趨近于輪詢算法。
二、java代碼實現
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));
});
}
}
運算結果如下所示:
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 對象隨機生成 [0, serverList.size()) 的整數;然后,通過索引獲取到服務器。
2、在多線程的情況下,若線程A修改 ServerManager.serverMap 的值,則線程B無法即時拿到線程A修改后的值,可能會導致請求錯誤,需要調用方進行容錯處理。
3、從宏觀的角度看,訪問量越大,負載越均衡。從微觀的角度看,局部并不那么均衡。
本文地址:https://blog.csdn.net/chinawangfei/article/details/109643598
如您對本文有疑問或者有任何想說的,請點擊進行留言回復,萬千網友為您解惑!
總結
以上是生活随笔為你收集整理的java random算法_负载均衡--随机算法(Random)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 永宏plc和台达vfd-m变頻器modb
- 下一篇: [生态建设] - js判断小技巧