Skip to content

chilly266futon/file-downloader-server

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

24 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

File Downloader Service

Веб-сервис для скачивания файлов по ссылкам с поддержкой graceful shutdown и восстановления состояния.

Описание

Сервис позволяет пользователям отправлять задачи со списками ссылок на файлы для скачивания. Файлы сохраняются в локальную папку, а статус задач можно отслеживать через REST API.

Ключевые возможности

  • Параллельная обработка: Настраиваемое количество воркеров для одновременного скачивания
  • Graceful shutdown: Корректное завершение работы с сохранением состояния
  • Персистентность: Сохранение и восстановление задач при перезапуске
  • Мониторинг: Отслеживание статуса выполнения задач
  • Таймауты: Защита от зависших загрузок

Архитектура и паттерны

Clean Architecture

Проект следует принципам чистой архитектуры:

internal/
├── domain/          # Бизнес-логика и интерфейсы
├── usecase/         # Use cases / сценарии использования
└── infrastructure/  # Внешние зависимости
    ├── config/      # Конфигурация
    ├── handlers/    # HTTP обработчики
    ├── storage/     # Реализации хранилищ
    └── workerpool/  # Worker Pool

Используемые паттерны

  1. Dependency Injection: Внедрение зависимостей через конструкторы
  2. Repository Pattern: Абстракция хранилища файлов через интерфейс Storage
  3. Worker Pool: Пул воркеров для параллельной обработки задач
  4. Graceful Shutdown: Корректное завершение работы с сохранением состояния
  5. Context Cancellation: Использование контекста для управления жизненным циклом

Состояния задач

  • pending - задача создана, ожидает обработки
  • running - задача выполняется
  • completed - задача успешно завершена
  • failed - задача завершилась с ошибкой

Установка и запуск

Требования

  • Go 1.24+
  • Доступ к интернету для скачивания файлов

Установка зависимостей

go mod download

Запуск

go run cmd/server/main.go

Сервер запустится на http://localhost:8080

Конфигурация

Настройки находятся в файле configs/config.yaml:

server:
  host: "0.0.0.0"
  port: 8080

workerpool:
  num_workers: 4          # количество параллельных воркеров
  task_queue_size: 100    # размер канала задач

storage:
  downloads_dir: "downloads"  # папка для сохранения файлов

tasks:
  file: "tasks.json"      # файл для сохранения состояния задач

API

Создание задачи

curl -X POST http://localhost:8080/tasks \
  -H "Content-Type: application/json" \
  -d '{
    "urls": [
      "https://example.com/file1.pdf",
      "https://example.com/file2.jpg"
    ]
  }'

Ответ:

{
  "id": "123e4567-e89b-12d3-a456-426614174000",
  "urls": ["https://example.com/file1.pdf", "https://example.com/file2.jpg"],
  "status": "pending",
  "created_at": "2025-01-15T10:00:00Z",
  "updated_at": "2025-01-15T10:00:00Z"
}

Получение всех задач

curl http://localhost:8080/tasks

Получение задачи по ID

curl http://localhost:8080/tasks/123e4567-e89b-12d3-a456-426614174000

Особенности реализации

Graceful Shutdown

При получении сигнала прерывания (Ctrl+C) сервис:

  1. Прекращает принимать новые HTTP-запросы
  2. Ожидает завершения текущих задач
  3. Сохраняет состояние всех задач в файл tasks.json
  4. Корректно завершает работу

Восстановление после перезапуска

При запуске сервис:

  1. Загружает задачи из файла состояния
  2. Переводит running задачи в состояние pending
  3. Добавляет незавершенные задачи в очередь обработки

Обработка ошибок

  • Таймауты: Каждый файл скачивается с таймаутом 3 минуты
  • Сетевые ошибки: При ошибке скачивания любого файла вся задача помечается как failed
  • Восстановление: Панические ситуации обрабатываются middleware

Ограничения и особенности

  1. Имена файлов: Используется базовое имя из URL (функция filepath.Base())
  2. Дублирование: Файлы с одинаковыми именами перезаписываются
  3. Размер файлов: Нет ограничений на размер (может потребовать доработки для production)
  4. Concurrency: Один файл = одна загрузка (можно добавить поддержку chunk-загрузки)

Тестирование

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

go test ./...

Запуск с покрытием

go test -coverprofile=coverage.out ./...
go tool cover -html=coverage.out

Тестовые сценарии

  • Создание и получение задач
  • Сохранение/загрузка состояния
  • Успешное скачивание файлов
  • Обработка ошибок сети
  • Локальное сохранение файлов

Развитие

Потенциальные улучшения

  1. База данных: Замена файлового хранилища на PostgreSQL/SQLite
  2. Retry mechanism: Повторные попытки при временных сбоях
  3. Прогресс загрузки: Отслеживание процента выполнения
  4. Webhooks: Уведомления о завершении задач
  5. Rate limiting: Ограничение нагрузки на внешние ресурсы
  6. Chunk downloading: Загрузка больших файлов частями
  7. Валидация URL: Проверка корректности ссылок
  8. Метрики: Интеграция с Prometheus/Grafana
  9. S3: Подключение объектного хранилища для загрузки файлов в облако

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages