Для простого распределителя используйте round-robin по доступным узлам, защищая общий счётчик от гонок. Выбор узла отделите от проксирования запроса, таймаутов и проверки здоровья backend.
Распределитель входящего трафика
Для простого распределителя используйте round-robin по доступным узлам, защищая общий счётчик от гонок. Выбор узла отделите от проксирования запроса, таймаутов и проверки здоровья backend.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Реализуйте простой распределитель запросов (load balancer). Система принимает входящий запрос, имеет набор узлов — серверов, на которых запущено одно и то же backend‑приложение. Необходимо определить, какой из серверов будет обслуживать текущий запрос, и перенаправить его туда. При этом можно использовать любые стратегии выбора (например, round‑robin, случайный выбор, наименьшая нагрузка и т.д.).
Ответ
Для простого распределителя используйте round-robin по доступным узлам, защищая общий счётчик от гонок. Выбор узла отделите от проксирования запроса, таймаутов и проверки здоровья backend.
Минимальный селектор для одного процесса:
from threading import Lock
class RoundRobin:
def __init__(self, servers):
self.servers = tuple(servers)
self.index = 0
self.lock = Lock()
def choose(self):
with self.lock:
if not self.servers:
raise RuntimeError('No backend available')
server = self.servers[self.index % len(self.servers)]
self.index += 1
return server
Прокси отправляет запрос выбранному upstream, не раскрывая внутренний адрес клиенту через обычный redirect. В рабочем решении нужны health checks, лимиты соединений, таймауты и безопасные повторы только подходящих операций. Round-robin не учитывает разную длительность запросов.