Skip to content

avtocod/golang-developer-test-task

Repository files navigation

Logo

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

Project language Build Status Do something awesome

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

Необходимо разработать приложение, предоставляющее 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