Какие алгоритмы балансировки нагрузки ты знаешь и как они влияют на тестирование?

«Какие алгоритмы балансировки нагрузки ты знаешь и как они влияют на тестирование?» — вопрос из категории Архитектура, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В контексте тестирования веб-приложений и API важно понимать алгоритмы балансировки нагрузки, так как они влияют на поведение системы и могут создавать специфичные баги.

Основные алгоритмы и их влияние на тестирование:

Алгоритм Принцип работы Что важно для тестирования
Round Robin Запросы поочередно распределяются по серверам в списке. Проверка, что состояние сессии (session stickyness) корректно работает, если не используется. Иначе пользователь может "перепрыгивать" между серверами с разными данными сессии.
Least Connections Новый запрос отправляется на сервер с наименьшим количеством активных соединений. Нагрузочное тестирование: нужно убедиться, что распределение действительно эффективно и не приводит к перегрузке одного сервера при "длинных" соединениях (WebSocket, long polling).
IP Hash Сервер для клиента определяется хэшем его IP-адреса. Один клиент всегда попадает на один сервер. Тестирование с одного IP (например, из офиса) может маскировать проблемы распределения. Необходимо тестировать с разных IP-адресов (через прокси, разные машины).
Weighted Round Robin/Least Connections У каждого сервера есть "вес" (приоритет). Более мощные серверы получают больше запросов. Проверка корректности настройки весов в конфигурации балансировщика и фактического распределения нагрузки под стрессом.

Ключевые аспекты для тестирования:

  1. Согласованность сессии (Sticky Session): Если приложение хранит состояние на сервере (in-memory cache, не вынесенная в Redis сессия), нужно проверить, что балансировщик корректно направляет запросы одного пользователя на один бэкенд-сервер, или что приложение использует общее хранилище сессий.
  2. Отказоустойчивость: Что происходит, если один из бэкенд-серверов падает во время выполнения запроса? Балансировщик должен перенаправить трафик, а пользовательский опыт не должен сильно пострадать (например, получить ошибку 502 и возможность повторить действие).
  3. Распределение в нагрузочном тестировании: При запуске нагрузочного теста с одного агента (например, JMeter) алгоритм IP Hash может направлять весь трафик на один сервер, искажая результаты. Нужно использовать несколько IP-адресов или DNS-имена, которые резолвятся в несколько IP.

Практический пример проверки: После деплоя на кластер из двух серверов я проверяю, что многократные запросы к API с ключом сессии приходят в один и тот же бэкенд (проверяя заголовки или логи сервера), если это требуется архитектурой приложения.