Необходимо разработать приложение, предоставляющее 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);
- Написание всех текстов коммитов - на английском языке.
Для выполнения задания лучше всего использовать данный репозиторий как шаблон, для чего просто перейдите по этой ссылке.
Данный репозиторий уже содержит Dockerfile
, docker-compose.yml
и Makefile
для быстрого запуска приложения силами docker
(нет необходимости устанавливать golang, redis и пр. локально). Всё, что необходимо - это установленные локально docker
и docker-compose
. После клонирования репозитория просто выполните docker-compose up -d
- и можно приступать к написанию полезного кода.
Ссылку на репозиторий с вашей реализацией необходимо отправить нашему HR или TeamLead, от которого вы получили ссылку на данный репозиторий.
Приложение должно успешно запускаться после выполнения:
$ git clone ...
$ make build
$ docker-compose up -d
$ docker-compose run --rm app ./app
Если для запуска приложения потребуется другой набор команд - обязательно отразите это в файле
README.md
вашего репозитория.
Так же должны выполняться unit-тесты с помощью команды:
$ make test
# and optionally:
$ make cover