Скажем, у вас есть серверы a
, b
, c
, d
. И у вас есть соответствующие веса 5
, 1
, 2
, 3
. Вы можете сделать взвешенный круглый робин следующим образом:
Random rand = new Random(seed);
void processRequest(Request r){
// assume rand.next() returns a uniformly distributed integer >= 0
int i = rand.next() % 11; // 11 is sum of weights
if(i <= 4) // process r with server a
else if(i == 5) // process r with server b
else if(i <= 7) // process r with server c
else // process r with server d
}
rand.next() % 11
возвращает равномерно распределенное целое число в диапазоне [0, 10]
(включительно). Мы обрабатываем запрос на сервере a
для пяти возможных значений [0, 4]
. Мы обрабатываем запрос на сервере b
только для одного возможного значения 5
и т. Д.
Обратите особое внимание на конкретный случайный метод, который вы используете, и на начальное значение.