Какие алгоритмы балансировки существуют
Что проверяют
Для тестировщика это вопрос не про реализацию, а про понимание: знаете ли вы, как запрос попадает на конкретный сервер, и сможете ли проверить, что балансировка работает. Следом часто спрашивают, как бы вы протестировали отказ одного узла или почему нагрузочный тест показал странную картину.
Как отвечать
Коротко назовите основные алгоритмы:
- Round Robin: запросы по кругу, для одинаковых серверов;
- Weighted Round Robin: мощному серверу больше запросов пропорционально весу;
- Least Connections: туда, где меньше активных соединений, полезен при запросах разной длительности;
- IP Hash или привязка по cookie: клиент всегда на одном сервере, так делают sticky-сессии;
- Random и его улучшение Power of Two Choices: из двух случайных серверов выбирается менее загруженный.
Затем переходите к тому, что делает QA:
- распределение: как понять, какой узел ответил. Служебный заголовок вроде
X-Served-By, логи или метрики по узлам. Серией запросов проверяете, что трафик идёт на все узлы в ожидаемой пропорции; - отказ узла: гасите один экземпляр и проверяете, что проверка здоровья вывела его из пула, пользователи не получают 502 дольше допустимого, а после возврата узел снова получает трафик;
- sticky-сессии: корзина и авторизация не теряются на следующем запросе, а при падении «своего» узла пользователь не зависает, а переезжает на другой;
- выкладка: при поочерёдном обновлении экземпляров запросы не теряются, старая и новая версии отвечают совместимо;
- нагрузочное тестирование: в JMeter, k6 или Gatling смотрите нагрузку на каждый узел, а не только общий RPS.
Где спотыкаются
Запускают нагрузочный тест с одной машины при балансировке по IP Hash, и вся нагрузка ложится на один сервер. Выводы о производительности кластера получаются неверными.
Знают названия алгоритмов, но не могут сказать, как проверить, куда ушёл запрос. Без этого любые выводы о балансировке строятся на догадках.
Проверяют только счастливый путь, когда все узлы живы. Самые неприятные дефекты появляются при выключении узла, поочерёдном деплое и возврате узла в пул.