Обратитесь к представлению кода Nginx: https://github.com/phusion/nginx/commit/27e94984486058d73157038f7950a0a36ecc6e35
class Server {
String name;
int weight;
int curWeight;
Server(String name, int weight) {
super();
this.name = name;
this.weight = weight;
}
void add(int weight) {
curWeight += weight;
}
void subtract(int weight) {
curWeight -= weight;
}
@Override
public String toString() {
return String.format("%s=%2d", name, curWeight);
}
public String getName() {
return name;
}
public int getWeight() {
return weight;
}
public int getCurWeight() {
return curWeight;
}
}
class LoadBalance {
private int matched = -1;
private Server[] servers;
LoadBalance(Server... servers) {
super();
this.servers = servers;
}
Server get() {
int totalWeight = 0;
for (int i = 0, len = servers.length; i < len; i++) {
servers[i].add(servers[i].getWeight());
totalWeight += servers[i].getCurWeight();
if (matched == -1 || servers[matched].getCurWeight() < servers[i].getCurWeight()) {
matched = i;
}
}
System.out.println(Arrays.toString(servers) + " " + servers[matched].getName() + " selected");
servers[matched].subtract(totalWeight);
System.out.println(Arrays.toString(servers));
return servers[matched];
}
}
public class LoadBalanceTest {
public static void main(String[] args) {
LoadBalance loadBalance = new LoadBalance(new Server("a", 5), new Server("b", 1), new Server("c", 1));
for (int i = 0; i < 10; i++) {
loadBalance.get();
}
}
}
Когда входной узел (a, b, c) имеет весовое соотношение (5,1,1), результат выводаследующим образом:
[a= 5, b= 1, c= 1] a selected
[a=-2, b= 1, c= 1]
[a= 3, b= 2, c= 2] a selected
[a=-4, b= 2, c= 2]
[a= 1, b= 3, c= 3] b selected
[a= 1, b=-4, c= 3]
[a= 6, b=-3, c= 4] a selected
[a=-1, b=-3, c= 4]
[a= 4, b=-2, c= 5] c selected
[a= 4, b=-2, c=-2]
[a= 9, b=-1, c=-1] a selected
[a= 2, b=-1, c=-1]
[a= 7, b= 0, c= 0] a selected
[a= 0, b= 0, c= 0]
[a= 5, b= 1, c= 1] a selected
[a=-2, b= 1, c= 1]
[a= 3, b= 2, c= 2] a selected
[a=-4, b= 2, c= 2]
[a= 1, b= 3, c= 3] b selected
[a= 1, b=-4, c= 3]
Для каждых 7 выполнений (весовая сумма) вес сбрасывается до 0, и доля времени распределения услуг также удовлетворяет весовой пропорции, и распределение также относительно равномерно a,a, b, a, c, a и a.
Но я не понимаю, почему это так. Как математически доказать алгоритм?