Вопрос с собеседования · Highload

Какие алгоритмы балансировки нагрузки вы знаете и когда какой лучше?

MiddleБалансировка нагрузки
Ещё спрашивают так:
  • Чем round robin хуже least connections?
  • Что такое power of two choices?
  • Когда нужна балансировка по хешу?
Коротко

Round robin — по кругу, хорош при одинаковых серверах и запросах. Least connections / least requests — тому, у кого меньше активных, учитывает медленные запросы и серверы. Power of two choices — взять двух случайных и выбрать менее загруженного: почти как least, но без глобального состояния.

  • Взвешенные варианты — для серверов разной мощности
  • По хешу ключа (consistent hashing) — когда важна привязка: кэш, сессии, шард
  • Случайный выбор хуже всех: очереди на неудачливых серверах

А ещё У нескольких балансировщиков без общего состояния least connections даёт стадный эффект — p2c устойчивее

Попробуйте сами

Балансировка: round robin, least connections, power of two choices

Подробно

Round robin — по очереди. Просто и без состояния. Работает, когда серверы одинаковы и запросы примерно одинаковые. Плохо, когда один сервер начал тормозить (GC, соседи, тяжёлый запрос): он продолжает получать ту же долю, его очередь растёт, хвост задержки — тоже. Взвешенный — серверам разной мощности пропорционально весу.

Случайный выбор — то же в среднем, но хуже: по случайности некоторые серверы получают серию запросов подряд.

Least connections / least outstanding requests — тому, у кого сейчас меньше всего запросов в работе. Медленный сервер автоматически получает меньше: его запросы дольше висят. Хорошо для разнородных запросов и долгих соединений. Минус — нужно знать актуальную загрузку всех серверов; при нескольких балансировщиках каждый видит только свои запросы, и все разом шлют на «самый свободный» — стадный эффект.

Power of two choices (p2c) — выбрать двух случайных и отправить менее загруженному. Удивительный результат теории вероятностей: максимальная загрузка падает экспоненциально по сравнению со случайным выбором, и это почти так же хорошо, как глобальный минимум. Не нужно опрашивать всех, нет стадного эффекта. Используется в Envoy, Finagle, NGINX (random two least_conn), gRPC.

Пиковая EWMA (peak exponentially-weighted moving average, Linkerd, Finagle) — учитывает и число запросов, и недавнюю задержку сервера.

По хешу ключа — один и тот же пользователь или ключ всегда попадает на тот же сервер. Нужен, когда у сервера есть состояние: локальный кэш, сессии в памяти, шард данных, WebSocket-комнаты. Обычный hash % N при изменении N перетасует почти всё — поэтому consistent hashing. Минус — горячие ключи создают горячие серверы.

Как выбрать:

  • одинаковые stateless-серверы, короткие запросы — round robin;
  • разная длительность запросов или риск медленных экземпляров — least requests или p2c;
  • много балансировщиков или клиентская балансировка — p2c;
  • серверы с состоянием по ключу — consistent hashing (с ограничением нагрузки, bounded load).

Вместе с алгоритмом нужны проверки здоровья, выбрасывание медленных (outlier detection), медленный старт для только что поднятых экземпляров (иначе least connections завалит холодный сервер).

Пример

import random

def p2c(servers):
    a, b = random.sample(servers, 2)
    return a if a.in_flight <= b.in_flight else b

# 100 серверов, случайный выбор: максимальная очередь ~ ln n / ln ln n
# power of two choices: максимальная очередь ~ ln ln n — на практике в разы меньше

Что хотят услышать

  • Round robin, least connections, хеш — и чем они отличаются.
  • Почему round robin плох при медленном экземпляре.
  • Power of two choices и чем он лучше глобального минимума при многих балансировщиках.
  • Когда нужна привязка по ключу и consistent hashing.

Частые ошибки

  • «Least connections всегда лучший» — при нескольких балансировщиках и холодном старте — нет.
  • Привязка сессий там, где сервис можно сделать stateless.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Round robin — для однородных, least conn — для медленных
  • ✗Least connections отправляет запрос серверу с наибольшим числом соединений
  • ✗Power of two choices требует глобального знания загрузки всех серверов в кластере
  • ✗Round robin учитывает медленные запросы лучше least connections

Что спросят дальше

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования