Сначала: git clone https://github.com/lokot0k/mtech_task/
В корне репозитория лежит мейкфайл, все развертывается с помощью команды make compose-up
На локалке сервисы можно запустить самому, но нужно поменять соответствующие переменные окружения (для удобства все они были вынесены в .env файлы, по одному на каждый сервис)
Ниже расписано больше про сервисы:
Бэкенд имеет свой makefile, который позволяет запускать сервис и делать миграции
Бэк генерирует swagger доку, доступную по адресу: http://0.0.0.0:8000/docs
Для бэкенда в докере также отдельным контейнером создается бд, помимо самого сервиса. Данные бд находятся в отдельном volume
Количество потоков и верхняя граница задержки настраиваются переменными окружения (также можно задать их через .env файл клиента)
Для исключения одновременной записи несколькими потоками в файл используется мьютекс (threading.Lock)
Сам сервис однопоточный, но должен разделять файл с другими инстансами, поэтому для индикации захвата процессом файла используется лок-файл, который создается при начале записи и удаляется в конце. Если инстанс не успевает захватить освободившийся файл, то текущие данные сохраняются внутри памяти, и происходит получение следующей порции данных. Таким образом, когда инстанс захватит общий ресурс, будут записаны все полученные им данные за промежуток времени без доступа к файлу.
В качестве параметров для get-запроса используются date_from и date_to, которые обозначают datetime начала и конца интервала времени, за которые необходимо выгрузить логи. Значение по умолчанию для date_from является начало эпохи, а значение по умолчанию для date_to - значение времени, когда запрос пришел на сервер.
Логика в бэкграунд-сервисе подразумевает, что будут выгружены сначала все записи от начала эпохи до текущего момента (первого реквеста), а далее каждым запросом будут получены данные, которые появились с момента предыдущего реквеста. Таким образом в файл будут выгружены все имеющиеся на данный момент записи
Сам общий ресурс (файл) храниться в отдельном volume