/mtech_task

Primary LanguagePython

MTECH TASK

Как пользоваться?

Сначала: git clone https://github.com/lokot0k/mtech_task/

В корне репозитория лежит мейкфайл, все развертывается с помощью команды make compose-up На локалке сервисы можно запустить самому, но нужно поменять соответствующие переменные окружения (для удобства все они были вынесены в .env файлы, по одному на каждый сервис)

Ниже расписано больше про сервисы:

BACKEND

Бэкенд имеет свой makefile, который позволяет запускать сервис и делать миграции

Бэк генерирует swagger доку, доступную по адресу: http://0.0.0.0:8000/docs

Для бэкенда в докере также отдельным контейнером создается бд, помимо самого сервиса. Данные бд находятся в отдельном volume

CLIENT

Количество потоков и верхняя граница задержки настраиваются переменными окружения (также можно задать их через .env файл клиента)

Для исключения одновременной записи несколькими потоками в файл используется мьютекс (threading.Lock)

BACKGROUND

Сам сервис однопоточный, но должен разделять файл с другими инстансами, поэтому для индикации захвата процессом файла используется лок-файл, который создается при начале записи и удаляется в конце. Если инстанс не успевает захватить освободившийся файл, то текущие данные сохраняются внутри памяти, и происходит получение следующей порции данных. Таким образом, когда инстанс захватит общий ресурс, будут записаны все полученные им данные за промежуток времени без доступа к файлу.

В качестве параметров для get-запроса используются date_from и date_to, которые обозначают datetime начала и конца интервала времени, за которые необходимо выгрузить логи. Значение по умолчанию для date_from является начало эпохи, а значение по умолчанию для date_to - значение времени, когда запрос пришел на сервер.

Логика в бэкграунд-сервисе подразумевает, что будут выгружены сначала все записи от начала эпохи до текущего момента (первого реквеста), а далее каждым запросом будут получены данные, которые появились с момента предыдущего реквеста. Таким образом в файл будут выгружены все имеющиеся на данный момент записи

Сам общий ресурс (файл) храниться в отдельном volume