Код Middle Кластер, воркеры, масштабирование обновлено
Плавный взвешенный round-robin как в nginx
Условие
Напиши weightedRoundRobin(servers, n): servers массив { name, weight }, вернуть имена серверов для первых n запросов по алгоритму smooth weighted round-robin:
- у каждого сервера есть
current, изначально 0; - на каждый запрос: к
currentкаждого сервера прибавить егоweight; выбрать сервер с максимальнымcurrent(при равенстве первый в массиве); вычесть из егоcurrentсумму всех весов.
Сервер с весом 0 не выбирается никогда. Если все веса нулевые, верни пустой массив.
Примеры
weightedRoundRobin([{"name":"a","weight":5}, {"name":"b","weight":1}, {"name":"c","weight":1}], 7) // ["a", "a", "b", "a", "c", "a", "a"]
weightedRoundRobin([{"name":"x","weight":1}, {"name":"y","weight":1}], 4) // ["x", "y", "x", "y"]
weightedRoundRobin([{"name":"big","weight":3}, {"name":"small","weight":1}], 8) // ["big", "big", "small", "big", "big", "big", "small", "big"]
Как подойти
Подсказки: 2
- Каждый шаг: всем
current += weight, у выбранногоcurrent -= total. - Строгое
>при выборе даёт «первый при равенстве».
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.
Предыдущий вопрос
Балансировка least connections
Следующий вопрос
Код-ревью: сервис перед масштабированием в 4 инстанса
Термины по теме
Ещё по теме «Кластер, воркеры, масштабирование»
- Консистентное хеширование с виртуальными узлами
- Модуль cluster
- cluster внутри Kubernetes
- Память у воркеров cluster
- cluster или worker_threads
- setInterval-крон при нескольких экземплярах
- Флаг --max-old-space-size
- Как Node.js использует несколько ядер