👣 Тестовое задание для GoLang-разработчика



Описание задания

Необходимо разработать приложение, предоставляющее HTTP API для получения данных о парковках такси в г. Москва. Данные необходимо брать с этой страницы ("Актуальная версия").



Описание необходимого функционала

Приложение должно реализовывать:



Функционал загрузки данных из файла (локального и/или по ссылке) в хранилище данных (данные на источнике могут как удаляться, так и добавляться);



Обслуживание HTTP запросов к API-endpoints, которые реализуют поиск по хранимым данным;

Обслуживание HTTP запросов к роуту, возвращающему метрические данные (в формате prometheus) работы приложения.



Обновление данных в хранилище должно происходить без остановки обслуживания HTTP запросов к API с учетом того, что их объем может быть очень большим (и маппинг данных на источнике может изменяться).



Методы HTTP API должны возвращать ответ в формате json. Время обработки одного запроса к HTTP API (не загрузка данных в хранилище) - не более 2 мс. до первого байта HTTP ответа (TTFB). Проектирование самих методов API - на ваше усмотрение (минимально необходимый функционал - это поиск по global_id, id и mode).



Метрические данные должны включать в себя как минимум следующие метрики:



Общее количество обработанных запросов к API-endpoints;

Количество ошибок обработки HTTP запросов к API-endpoints (плюсом будет "разведение" по различным кодам ответов);

Данные по времени обработки HTTP запросов к API-endpoint;

Дополнительные метрики, на ваше усмотрение.



Требования к реализации



В качестве хранилища данных необходимо использовать Redis;

Все функции (экспортируемые и не экспортируемые) должны сопровождаться понятным комментарием (если возможно - на английском языке);

Не стоит излишне сокращать имена переменных и констант - код пишется для людей, и он должен быть максимально простым и понятным;

Можно использовать любые сторонние пакеты, но не использовать какой-либо фреймворк;

Весь ключевой функционал должен быть зафиксирован unit-тестами;

После завершения работы над заданием необходимо написать сопроводительную документацию по работе с приложением в файле README.md в корне репозитория;

Конфигурация параметров подключения к хранилищу данных должна иметь возможность управляться как флагами запуска, так и переменными окружения. Возможности конфигурирования должны быть описаны в файле README.md вашего репозитория.



Плюсами будут являться

Настройка CI (силами GitHub actions, TravisCI, etc) выполняющая запуск тестов и сборки на каждый коммит;

Автоматическая сборка Docker-образа с приложением;

Интуитивно-понятное разбитие коммитов - одной конкретной задаче - один коммит или PR (её правки - отдельный коммит или PR);

Написание всех текстов коммитов - на английском языке.



@golang_interview