itvbackend
Решение тестовой задачи для собеседования в компании ITV
Условие задачи
Нужно написать back-end для сервиса, который бы исполнял http-запросы к другим ресурсам.
Алгоритм работы.
Клиент просит сервис выполнить http запрос к некому ресурсу.
В просьбе в формате json описаны поля {метод, адрес}
(опционально: заголовки, тело). Например, {GET http://google.com}.
Сервис выполняет запрос из просьбы и в качестве ответа клиенту
возвращает json объект с полями {сгенерированный id запроса,
http статус, заголовки, длинна ответа}.
Список просьб должен сохраняться на сервере, например в map.
Выше описана операция создания просьбы (FetchTask). Предусмотреть
ещё операции получения всех существующих просьб
(опционально постранично), операция удаления просьбы по id.
Задача предполагает, что кандидат покажет знание перечисленных
выше пунктов за исключением, может быть, goroutine/chan/sync.Mutex.
Так же мы хотели бы увидеть код приближённый к продакшн версии
с понятными наименованиями переменных и http route-ов,
unit тестами и т.д. Если кандидат уверен в своих силах,
для выполнения просьб можно реализовать асинхронный вариант
работы на основе паттерна workerpool на goroutine-ах,
который бы получал задания из канала, выполнял их и безопасно
в смысле многопоточности, сохранял результаты в БД.
Сборка и запуск приложения
После выгрузки кода из репозитория выполните сборку приложения
командой:
$ make build
Выполните unit-тесты командой:
$ make test
Запустите приложение:
$ ./build/bin/itvbackend
Для демонстрации работы приложения запустите тестовые скрипты:
$ ./scripts/client-app.sh
$ ./scripts/paginator.sh
Режим конкурентного выполнения просьб
В этом режиме приложение взаимодействует с БД PostgreSQL.
Создайте базу данных itvbackend на сервере PostgreSQL и
выполните следующую команду для запуска миграций:
$ make migrate-db
2020/07/07 11:10:30 Start buffering 20200707011001/u create_requests
2020/07/07 11:10:30 Read and execute 20200707011001/u create_requests
2020/07/07 11:10:30 Finished 20200707011001/u create_requests (read 20.631333ms, ran 35.099882ms)
2020/07/07 11:10:30 Finished after 64.956965ms
2020/07/07 11:10:30 Closing source and database
Также приложение создает Worker Pool для конкурентной обработки
запросов, размером которого можно управлять с помощью параметров
командной строки.
Для запуска приложения выполните команду:
$ ./build/bin/itvbackend --mode=database --pool=5 \
--dsn='postgres://postgres:postgres@localhost:5432/itvbackend?sslmode=disable'
Запустите тестовый скрипт для демонстрации работы:
$ ./scripts/database-mode.sh
После выполнения скрипта в таблице requests появятся новые
записи.