Что такое балансировка нагрузки (load balancing)?
Балансировка нагрузки (Load Balancing) – это распределение входящих запросов между несколькими серверами для обеспечения высокой доступности, равномерного использования ресурсов и отказоустойчивости. Как администратор в поликлинике, который направляет пациентов к разным врачам, чтобы ни один не простаивал и ни один не был перегружен.
Пример кода
Клиенты
┌────┬────┬────┐
│ │ │ │
▼ ▼ ▼ ▼
┌─────────────────────┐
│ Load Balancer │
│ (Nginx / HAProxy │
│ / AWS ALB) │
└──┬──────┬──────┬────┘
│ │ │
▼ ▼ ▼
┌──────┐┌──────┐┌──────┐
│App 1 ││App 2 ││App 3 │
└──────┘└──────┘└──────┘
Алгоритмы балансировки
- Round Robin – запросы распределяются по очереди. Простой, но не учитывает текущую нагрузку серверов.
- Weighted Round Robin – учитывает веса (мощность) серверов. Более мощный сервер получает больше запросов.
- Least Connections – запрос направляется к серверу с наименьшим числом активных соединений. Хорош при неравномерных по длительности запросах.
- Least Response Time – к серверу с минимальным временем отклика.
- IP Hash – определение сервера по хешу IP-адреса клиента. Гарантирует, что один клиент всегда попадает на один сервер (sticky sessions).
- Random – случайный выбор сервера. Прост в реализации и при большом числе узлов статистически близок к Round Robin.
L4 vs L7 балансировка
| Аспект | L4 (транспортный уровень) | L7 (уровень приложения) |
|---|---|---|
| Уровень OSI | 4 (TCP/UDP) | 7 (HTTP/HTTPS) |
| Что видит | IP-адреса, порты | URL, заголовки, cookies, тело запроса |
| Скорость | Быстрее (не разбирает содержимое) | Медленнее (анализирует HTTP) |
| Возможности | Простая маршрутизация | Content-based routing, A/B-тестирование, SSL termination |
| Примеры | HAProxy (L4 mode), AWS NLB | Nginx, HAProxy (L7 mode), AWS ALB |
| Применение | TCP-сервисы, БД, высокопроизводительная маршрутизация | Веб-приложения, REST API, микросервисы |
L7 балансировка позволяет маршрутизировать по содержимому запроса:
Пример
/api/payments → Payment Service (3 инстанса)
/api/clients → Client Service (2 инстанса)
/api/reports → Report Service (1 инстанс)
Health Checks
Балансировщик периодически проверяет доступность серверов. Неработающие серверы исключаются из пула до восстановления. В Spring Boot для этого используется Spring Actuator (эндпоинт /actuator/health), который позволяет настроить проверки не только самого приложения, но и его зависимостей (БД, очереди, внешние сервисы).
На собеседовании: Интервьюер ожидает знание разницы между L4 и L7, а также понимание Health Checks. Частая ошибка – не упоминать sticky sessions и связанные с ними проблемы при горизонтальном масштабировании.