Какой алгоритм балансировки нагрузки распределяет запросы между серверами последовательно по кругу

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

Ответ

Round Robin (RR) — это алгоритм балансировки нагрузки, при котором запросы клиентов распределяются между серверами в группе последовательно и циклически.

Принцип работы

Представим, что у нас есть 3 сервера (A, B, C). Запросы будут распределяться следующим образом:

  1. Первый запрос → Сервер A
  2. Второй запрос → Сервер B
  3. Третий запрос → Сервер C
  4. Четвертый запрос → Сервер A (цикл начинается заново)

Пример: конфигурация Nginx

Nginx использует Round Robin по умолчанию. Это самый распространенный и наглядный пример.

http {
    # Определение группы серверов (апстрим)
    upstream my_backend {
        # Алгоритм Round Robin используется по умолчанию
        server backend1.example.com;
        server backend2.example.com;
        server backend3.example.com;
    }

    server {
        listen 80;

        location / {
            # Все запросы перенаправляются на группу серверов
            proxy_pass http://my_backend;
        }
    }
}

Преимущества и недостатки

  • (+) Простота: Очень легко реализовать и понять.
  • (-) Не учитывает нагрузку: Алгоритм не знает, насколько загружен каждый сервер. Если один сервер медленнее других, он все равно будет получать равное количество запросов, что может стать узким местом.
  • (-) Не учитывает состояние: Не подходит для stateful-приложений без дополнительных механизмов (например, sticky sessions).

Альтернативы

  • Weighted Round Robin: Серверам с большей мощностью назначается больший "вес", и они получают больше запросов.
  • Least Connections: Новый запрос направляется на сервер с наименьшим количеством активных соединений.
  • IP Hash: Сервер для обработки запроса выбирается на основе хеша IP-адреса клиента, что обеспечивает привязку клиента к одному серверу.