Skip to content

torderonex/load-balancer

Repository files navigation

HTTP-балансировщик нагрузки

Реализованный функционал

Балансировщик нагрузки:

  • HTTP-сервер для приема и перенаправления запросов
  • Настраиваемая конфигурация через YAML-файл или переменные окружения
  • Поддержка различных алгоритмов распределения нагрузки:
    • Round Robin (циклическое распределение)
    • Random (случайное распределение)
  • Проверка доступности бэкенд-серверов (health checks)
  • Обработка ситуаций с недоступными серверами
  • Конкурентная обработка запросов с использованием горутин
  • Подробное логирование всех операций

Ограничение частоты запросов (Rate Limiting):

  • Реализация алгоритма Token Bucket
  • Индивидуальные ограничения для каждого клиента (по IP-адресу)
  • Настраиваемые параметры: емкость бакета и скорость пополнения токенов
  • Автоматическое пополнение токенов с использованием таймера
  • Потокобезопасная работа в условиях высокой нагрузки

Дополнительные возможности:

  • API для управления настройками клиентов:
    • Изменение лимитов для отдельных клиентов
  • Поддержка хранения данных в Redis или в памяти
  • Graceful shutdown для корректного завершения работы
  • Docker и Docker Compose для простого развертывания
  • Интеграционные тесты для проверки работоспособности

Архитектура проекта

Проект имеет модульную архитектуру и разделен на следующие компоненты:

  • app - основной компонент, объединяющий все остальные части
  • balancer - модуль балансировки нагрузки
  • limiter - модуль ограничения частоты запросов
  • storage - интерфейсы и реализации хранилищ данных
  • config - работа с конфигурацией
  • handler - обработчики HTTP-запросов для API
  • model - общие структуры данных

Инструкция по запуску

Запуск с использованием Go

  1. Установите Go (версия 1.24+)

  2. Настройте конфигурацию в файле config/config.yml:

    logger:
      level: debug
    proxy_server:
      port: 8080
      read_timeout: 10s
    api_server:
      port: 8081
      read_timeout: 10s
    rate_limiter:
      enabled: true
      default_rate: 100
      capacity: 100
      refill_interval: 1s
    health_check:
      enabled: true
      check_interval: 5s
    balancer:
      strategy: round_robin  # или random
      backends:
        - http://localhost:8091
        - http://localhost:8092
        - http://localhost:8093
  3. Запустите приложение:

    go run cmd/app/main.go

Запуск с использованием Docker

  1. Установите Docker и Docker Compose

  2. Соберите и запустите контейнеры:

    docker-compose up -d
  3. Для остановки:

    docker-compose down

Примеры использования

Отправка запросов через балансировщик

# Простой запрос
curl http://localhost:8080/

# Отправка большого количества запросов (тест нагрузки)
ab -n 1000 -c 100 http://localhost:8080/

Управление ограничениями для клиентов через API

# Установка скорости для клиента
curl -X POST -H "Content-Type: application/json" -d '{"clientId":"127.0.0.1","rate":50}' http://localhost:8081/client/rate

# Установка емкости для клиента
curl -X POST -H "Content-Type: application/json" -d '{"clientId":"127.0.0.1","capacity":200}' http://localhost:8081/client/capacity

# Блокировка клиента
curl -X POST -H "Content-Type: application/json" -d '{"clientId":"127.0.0.1","capacity":0}' http://localhost:8081/client/capacity

Запуск тестов

go test ./...

go test -tags=integration ./integration/...

go test -race ./...

Требования к системе

  • Go версии 1.24 или выше
  • Redis (опционально, для хранения данных)
  • Docker и Docker Compose (для запуска в контейнерах)

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages