Алгоритм балансировки легко принять за маленькую техническую деталь, хотя именно он определяет, насколько ровно система переживает длинные запросы, горячие ключи и изменения пула узлов.
Глава сравнивает базовые алгоритмы распределения трафика через длительность запросов, неравномерность нагрузки, локальность ключей и цену перераспределения при деградации.
На интервью это помогает обсуждать не название алгоритма, а профиль нагрузки, который вы защищаете, и признаки того, что выбранная схема перестаёт работать.
Практическая польза главы
Профиль нагрузки
Сначала фиксируйте форму трафика: ровный поток, длинные запросы, горячие ключи и долю операций с состоянием.
Неравномерная нагрузка
Смотрите, что будет при длинных запросах, всплесках и деградации отдельных узлов, а не только в спокойном режиме.
Локальность ключей
Понимайте цену локальности: меньше промахов кэша, но выше риск горячих ключей и перекоса распределения.
Аргументация выбора
Объясняйте, какой профиль трафика защищает алгоритм и по каким сигналам его пора пересматривать.
Источник
Envoy Load Balancing
Практическое описание алгоритмов балансировки и сценариев применения.
Выбор алгоритма балансировки выглядит как мелкая настройка ровно до первого перекоса нагрузки. На деле он задаёт , устойчивость пула и то, ровно ли узлы держат реальный трафик под пиком.
, и решают одну задачу по-разному: либо держат базовую равномерность, либо подстраиваются под текущую нагрузку, либо сохраняют привязку ключа к тому же узлу.
Реальный выбор почти всегда упирается в , , ожидаемую , долю сервисов и компонентов , а также требования к .
Равномерность
Циклическое распределение (round robin) даёт понятную базовую справедливость, если узлы одинаковы по мощности.
Адаптация к нагрузке
Выбор узла с наименьшим числом соединений (least connections) лучше подстраивается, когда одни запросы завершаются быстро, а другие держат соединение долго.
Локальность ключей
Согласованное хеширование (consistent hashing) уменьшает миграцию ключей и число промахов кэша при изменениях пула.
Операционная устойчивость
Без проверок состояния, плавного ввода и безопасного вывода узлов даже хороший алгоритм отправит трафик на узел, который ещё не прогрелся или уже падает.
Как выбрать алгоритм
Опишите профиль нагрузки
Шаг 1Зафиксируйте длительность запросов, всплески трафика, распределение ключей и долю операций с состоянием.
Сопоставьте алгоритм и поведение трафика
Шаг 2Циклическое распределение подходит для ровного пула, выбор узла с наименьшим числом соединений — для неравномерной длительности, а согласованное хеширование — для локальности ключей и привязки состояния.
Проверьте деградационные сценарии
Шаг 3Смоделируйте выключение узла, перегрузку и повторные попытки, затем посмотрите на 95-й и 99-й перцентили задержки и перераспределение ключей.
Добавьте эксплуатационные ограничения
Шаг 4Настройте проверки состояния, плавный ввод, плавный вывод соединений и сигналы по насыщению и горячим ключам.
Базовые алгоритмы и визуализация
Один и тот же поток запросов, три алгоритма — и три разных картины загрузки узлов. Переключайте алгоритм и смотрите, где появляется перекос.
Round Robin
Запросы распределяются по серверам по кругу: S1 -> S2 -> S3 -> S1.
Плюсы
- Очень простая реализация и предсказуемое поведение.
- Хорошо подходит для сервисов без сохранения состояния с одинаковыми узлами.
- Даёт небольшие накладные расходы на стороне балансировщика.
Ограничения
- Не учитывает текущую загрузку и медленные узлы.
- При неоднородных серверах может ухудшать задержку.
Очередь запросов
Балансировщик
Round Robin
Сервер A
Сервер B
Сервер C
Готово к симуляции. Запусти авто-режим или сделай один шаг.
Последнее решение: —
Сравнение алгоритмов и ключевые компромиссы
Сравнивайте алгоритмы не по известности, а по тому, как они ведут себя при перегрузе, изменении пула и росте неравномерности трафика. Для особенно важны , и .
| Алгоритм | Что он учитывает | Поведение при деградации | Качество распределения | Сложность | Лучше всего подходит |
|---|---|---|---|---|---|
| Round Robin | Почти не учитывает текущее состояние узла | При отказе просто исключает узел из ротации | Хорошая при ровном и однотипном трафике | Низкая | Однородный пул сервисов без сохранения состояния |
| Least Connections | Смотрит на число активных соединений | Лучше переносит длинные запросы и всплески нагрузки | Выше при неравномерной длительности запросов | Средняя | Нагрузка со смешанной длительностью запросов |
| Consistent Hashing | Маршрутизирует по ключу запроса | Переназначает только часть ключей при изменении пула | Зависит от виртуальных узлов и профиля ключей | Высокая | Трафик с привязкой состояния и чувствительностью к локальности ключей |
Практические ориентиры
Быстрые правила
- Начинайте с алгоритма: циклическое распределение (round robin), если пул узлов однородный, а запросы близки по длительности.
- Переходите на выбор узла с наименьшим числом соединений (least connections), когда в системе смешаны короткие и длинные запросы.
- Используйте согласованное хеширование (consistent hashing), если важно удерживать ключ рядом с тем же узлом и не переносить состояние по кластеру.
- Проверяйте выбор на пиковом профиле нагрузки и при деградации узлов, а не только на среднем трафике.
Частые ошибки
- Выбирать алгоритм без анализа длительности запросов, всплесков нагрузки и перекоса распределения ключей.
- Использовать согласованное хеширование (consistent hashing) без виртуальных узлов и без контроля горячих ключей.
- Игнорировать проверки работоспособности, плавный ввод в трафик и плавный вывод соединений.
- Сводить оценку нагрузки только к числу активных соединений, не глядя на CPU, запросы в секунду и 99-й перцентиль задержки.
- Смешивать липкую и обычную маршрутизацию без ясного резервного сценария.
Проверки перед боевым запуском
Связанные главы
- Балансировка трафика - даёт архитектурный контекст L4/L7, контроля состояния и глобальной маршрутизации, поверх которого выбираются конкретные алгоритмы.
- Принципы проектирования масштабируемых систем - объясняет, как распределение трафика связано с задержкой, пропускной способностью и общими решениями по росту системы.
- Обнаружение сервисов (service discovery) - показывает, как поддерживать актуальный пул инстансов, на который алгоритм опирается при выборе узла.
- Сервисная сетка (service mesh) - переносит алгоритмы балансировки в сервис-сервис трафик и дополняет их политиками повторов и изоляции проблемных инстансов.
- Стратегии кэширования - помогает разбирать локальность ключей и эффекты горячих ключей, критичные для согласованного хеширования.
- Multi-region / Global Systems - добавляет региональный слой распределения трафика и стратегию переключения между площадками.
- API Gateway - показывает прикладной сценарий, где алгоритмы балансировки работают вместе с прикладными правилами маршрутизации.
