LINKeRxUA
@LINKeRxUA
web dev

Как построить приоритетную очередь на подобии weighted round robin?

К примеру у нас есть массив серверов, где указано процент (весы балансировки).

<?php $server = [
   's01' => 10/100, // может обработать 10 % задач и текущего стека очереди
   's02' => 20/100,
   's03' => 25/100,
   's04' => 20/100,
   's05' => 25/100,
];?>

Это означает что каждый:

10й запрос (1/0.1) идет на s01

5й запрос (1/0.2) идет на s02

4й запрос (1/0.25) идет на s03

5й запрос (1/0.2) идет на s04

4й запрос (1/0.25) идет на s05


Каким должен быть расчет чтобы например из стека в 100 запросов. каждый запрос перенаправить пропорционально указанным коэффициентами производительности?

Смотрел как работает RR для распределения задач к CPU, У меня что то похожее, но "вывернутое на изнанку". Там есть немало важный коэффициент "условное время завершения", относительно которого строится по диаграмме Ганта наиболее подходящая (быстрее обрабатываемая) очередь для выполнение. У меня нет такого как "условное время завершения".

Помогите с написанием или формулы для расчета "куда направить каждый Nth запрос из 100" или построить массив который равномерно заполниться ['s1', 's2', 's3', 's4', 's5', 's2', 's3'...], длина которого === 100.
  • Вопрос задан
  • 501 просмотр
Пригласить эксперта
Ответы на вопрос 1
wataru
@wataru Куратор тега Алгоритмы
Разработчик на С++, экс-олимпиадник.
Ну, массив строиться очень просто - сначала ставите туда N1 значений s1, потом N2 Значений s2 и т.д.
Что-то вроде такого:
vector<int> a(100);
for (int i = 0, cur = 0; i < k; ++i ) {
  for (int j = 0; j < n[i]; j++) {
    a[cur++] = i;
  }
}


Правда он будет вида {'s1', 's1', 's1', ... 's2', 's2',...]. Если это недопустимо, массив можно перемешать:
for (int i = 1; i < 100; i++) {
   int j = rand() % (i+1);
   swap(a[i], a[j]);
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы