Skip to content

Кейс асинхронного файлового сервиса

Notifications You must be signed in to change notification settings

s-klimov/async-file-service

Repository files navigation

Асинхронный микросервис хранения файлов

Микросервис помогает работе основного сайта и обслуживает запросы на сохранение и получение файлов.

Как установить

Для работы микросервиса нужен Python версии не ниже 3.10.
Для настройки локального окружения нужно установить Poetry. Скопируйте файл .env.dist с перечнем требуемых переменных окружения в .env и заполните его. Пример заполнения:

FILE_SERVICE_PORT=8080
FILE_SERVICE_DIR=archive
FILE_SERVICE_DATABASE_URL=sqlite+aiosqlite:///:memory:
FILE_SERVICE_CHUNK=65_536
poetry install

Как запустить web-сервер

Получить справку о параметрах запуска web-сервера:

python server.py -h

Запустить web-сервер:

poetry run python server.py [-h] [--port PORT] [--dir DIR] [--database_url DATABASE_URL] [--chunk CHUNK]

Параметры:

  • port - порт файлового сервера.
  • dir - путь до папки, где микросервис будет хранить файлы. Путь должен быть существующим.
  • database_url - адрес базы данных.
  • chunk - размер "порции", которыми сервис возвращает файлы.

Значение параметров может быть предустановлено через переменные окружения, описанные в файле .env.

Использование микросервиса

В микросервисе реализованы два метода:

1. Сохранение файла в сервисе

POST http://localhost:8080/files/

Пример заголовка запроса:

    'Host': 'localhost:8080',
    'Content-Disposition': 'attachment;filename=2.jpg',
    'Accept': '*/*',
    'Accept-Encoding': 'gzip, deflate',
    'User-Agent': 'Python/3.10 aiohttp/3.8.4',
    'Content-Type': 'application/octet-stream',
    'Transfer-Encoding': 'chunked'

Тело запроса - байты файла, разбитые на порции ("чанки"). Полный скрипт формирования запроса находится в модуле sender.py.
Метод возвращает id, под которым был сохранен файл.

2. Получение файла из сервиса

GET http://localhost:8080/files/<id файла>/

Метод возвращает байтовый поток, который клиент созраняет в файл.

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

Тесты написаны с исопльзвоанием pytest. Перед выполнением тестов заполните переменные окружения в .env:

TEST_FOLDER = test_archive  # папка для хранения файлов в сервисе во время его запуска в тестовом режиме
TEST_CHUNK_SIZE = 3  # размер чанка для передачи его в сервис
TEST_DATABASE_URL = sqlite+aiosqlite:///:memory:  # временная БД для тестирования

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

pytest -s

Консольный скрипт sender.py

Скрипт формирует post-запрос в адрес микросервиса для сохранения в нём файла.

Интерфейс командной строки

python sender.py [-h] [--protocol {http,https}] [--host HOST] [--port PORT] [--url URL] [--chunk_size CHUNK_SIZE] --path PATH
  • protocol - Протокол файлового сервера
  • host - Хост файлового сервера
  • port - Порт файлового сервера
  • url - Урл для доступа к методу сохранения файла
  • chunk_size - Размер порции файла для считывания в ОЗУ, в байтах
  • path - Пусть до файла сохраняемого в файловом сервисе

Получить справку о параметрах:

python sender.py -h

Цели проекта

Код написан в учебных целях.

About

Кейс асинхронного файлового сервиса

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published