Round Robin
По кругу и всем поровну: расхождение максимум один слот.
1class RoundRobin<T> {2 private items: T[]3 private idx = 04 5 constructor(items: T[]) { this.items = items }6 7 next(): T {8 const item = this.items[this.idx % this.items.length]!9 this.idx++10 return item11 }12}Проблема
Распределить нагрузку справедливо: первый свободный сервер получает всё, случайный — возможны перекосы. Нужен строгий «по кругу» без голодания.
Что вы видите
Указатель next ходит по клиентам; лог слотов показывает абсолютную справедливость.
Как это работает
Индекс по модулю числа клиентов: next() = items[i % n], i++. Справедливость абсолютная — расхождение максимум один слот. Не учитывает вес запроса и состояние сервера — для этого есть weighted RR и least-connections.
Пошаговый разбор
- 01
next
Индекс по модулю числа клиентов.
- 02
Слот
Каждый получает по очереди.
- 03
Справедливость
Разница ≤ 1 слот.
Complexity и ограничения
См. complexity в шапке страницы.
Edge cases
- Один сервер из строя
Круг пропускает его — справедливость сохраняется.
- Запросы разной стоимости
RR не учитывает вес: тяжёлый запрос блокирует слот.
- k клиентов, k+1-й запрос
Первый клиент получает второй ход — расхождение максимум 1.
Где встречается в реальности
Продукт
Классический приём в реальных системах.
Собеседования
Стандартный вопрос на понимание структуры.
Связанные алгоритмы
«Балансировка без приоритетов: по кругу»
Тот же сценарий StepSequence в вертикальной композиции — с safe zones и записью WebM ниже на странице.
Shorts 9:16
Вертикальная композиция строится той же последовательностью шагов, что и страница: safe zones отмечены пунктиром (там живёт UI платформ), биты сценария подсвечиваются по прогрессу. Кнопка записи сохраняет WebM — детерминированная StepSequence даёт воспроизводимый ролик без монтажа.