Задача разработать сервис, через который продавцы смогут передавать нам свои товары пачками в формате excel (xlsx):
Инструкция:
- Предполагается, что у пользователя уже настроен Docker.
- Выполните docker-compose up --build main
Замечения по заданию: "Сервис принимает на вход ссылку на файл и id продавца, к чьему аккаунту будут привязаны загружаемые товары": Не было понятно, что имеется ввиду под ссылкой на файл, у меня было 2 решения:
- Использовать FormFile для загрузки файла клиента на сервер с последующей работой (отказался от варианта, так как просили только api).
- Использовать просто "путь до файла" на сервере, то есть файл указанный уже есть на сервере (остановился на этом варианте).
На сервере для проверки используются 4 файла в директории ExcelExample: Add.xlsx, Delete.xlsx, Update.xlsx, AddDeleteUpdate.xlsx
"Для проверки работоспособности сервиса нужно так же реализовать метод, с помощью которого можно будет достать список товаров из базы. Метод должен принимать на вход id продавца, offer_id, подстрока названия товара (по тексту "теле" находились и "телефоны", и "телевизоры"). Ни один параметр не является обязательным, все указанные параметры применяются через логический оператор "AND"":
Для этого реализован метод POST: пользователь отправляет запрос на сервер localhost:8080/info c json: { "selled_id":1, "offer_id":13, "name":"теле" }
Усложнения:
"написаны тесты": для работы с файлом excel были написаны функции на проверку корректности входных данных, именно их тестировал. Результаты можно посмотреть в "processing/test.log"
"проведено нагрузочное тестирование с целью понять, с какой скоростью сервис может переваривать файлы": Задание было выполнено. Для тестирования был взят JMeter (смотреть рисунок test_server/Результаты тестирования). В результате тестирования выявил проблемы:
-
Одновременная запись и чтение map (перем. Conveyor) приводила к ошибке, проблема решилась с введением мьютекса.
-
Также была выявлена проблема: "panic: pq: sorry, too many clients already", но не стал ее решать.
"реализована асинхронная схема работы, т.е. сервис принимает запрос, сразу возвращает id задания и в отдельной горутине начинает его выполнять. Клиент может узнать статус задания отдельным запросом":
реализовал:
на localhost:8080/data пользователь отправляет json (метод POST) как пример: { "selled_id":1, "excelFileName":"./ExcelExample/Add.xlsx" }
в ответ приходит результат { id задания } в виде json
для получения результата статистики, пользователь переходит на localhost:8080/data/{ id задания }