> Какие алгоритмы балансировки подходят для распределенных систем без синхронизации (Go)

Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: Ozon

Стек: Go

> Пример ответа

В распределенных системах без синхронизации (или с минимальной синхронизацией) ключевая задача - избежать единой точки отказа и глобального состояния. Для Go-решений (например, микросервисы на gRPC или HTTP) подходят следующие алгоритмы:

  1. Consistent Hashing - идеален для кэширования и шардирования. Не требует координации: каждый узел независимо вычисляет, какой сервер отвечает за ключ. В Go реализуется через кольцо хэшей (например, библиотека hashicorp/memberlist или кастомная реализация с сортированным списком). Минус: при добавлении/удалении узлов часть ключей перераспределяется, но минимально.

  2. Random Load Balancing - простейший вариант: клиент выбирает сервер случайно. В Go это делается через rand.Intn(len(backends)). Работает без синхронизации, но может давать неравномерную нагрузку при малом числе запросов. Подходит для систем с большим числом запросов (закон больших чисел выравнивает нагрузку).

  3. Power of Two Choices - улучшение случайного: выбираются два случайных сервера, затем выбирается менее загруженный. Требует минимальной информации о нагрузке (например, количество активных соединений), которую можно получать асинхронно (через метрики или heartbeat). В Go реализуется с помощью атомарных счетчиков (sync/atomic) без блокировок.

  4. Round Robin без состояния - если список серверов статичен, можно использовать атомарный счетчик (atomic.AddUint64). Но при изменении списка (например, при сбое) потребуется синхронизация, поэтому в динамических системах лучше комбинировать с Consistent Hashing или Random.

Для Go-стэка рекомендую Consistent Hashing как основной алгоритм для распределенных систем без синхронизации, так как он обеспечивает детерминированное распределение и устойчив к изменениям топологии. Для простых случаев (например, тестовые стенды) - Random.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью