MikhailFerapontow / yadro-go

Проект с Golang курс | YADRO
1 stars 0 forks source link

feat(concurrency): add concurrency for fetching comics #6

Closed MikhailFerapontow closed 4 months ago

MikhailFerapontow commented 4 months ago

Issue #5 выполнен.

Выполнены все пункты, кроме 6-го.

Объяснение числа goroutines.

Было проведено исследование зависимости скорости скачивания комиксов от числа goroutines. Исселедование проходило на следующей машине:

Что могло повлиять на результаты

Мой провайдер не даёт доступа к сайту xkcd.com, поэтому исследование проводилось с использованием USB-модема телефона c Tele-2. Замеры проводились единожды, поэтому велик фактор погрешности.

Результаты

Можно заметить, что при увеличении числа goroutines, начиная с 90, не происходит увеличение скорости. graph

MikhailFerapontow commented 4 months ago

Сейчас функция GetComics работает через самописный working pool. В будущем он перейдёт на errgroup. Но у меня вопрос: Как без errgroup правильно организовать обработку контекста?

vbelogrudov commented 4 months ago

Сейчас функция GetComics работает через самописный working pool. В будущем он перейдёт на errgroup. Но у меня вопрос: Как без errgroup правильно организовать обработку контекста?

Привет,

https://golang.hotexamples.com/examples/net.http/Request/WithContext/golang-request-withcontext-method-examples.html если идет речь об отмене реквестов. Если реквесты и так с таймаутом, можно прерывать for:

for ...
    select {
       case <- ctx.Done(): return
       default:
    }
MikhailFerapontow commented 4 months ago

Так же добавил в логи сообщение об успешном окончании операции добавления комиксов в db. До этого логи заканчивались на ошибке, потому что я хотел сохранить следующую структуру db:

[
{
//comics 1
},
{
//comics 2
},
...
]

Для этого забирал всё что до этого находилось в database.json, апендил к зафетченным комиксам и после добавлял обратно в базу. Но при остутствии записей в database.json (пустой файл) Unmarshal выдёт ошибку, ведь пустая строка не является валидным json. На самом же деле комиксы добавлялись в db.

MikhailFerapontow commented 4 months ago

Исправил баг с увеличением базы данных на 1 запись при каждом запуске. Баг происходил из-за 404 комикса. Добавил его в хэш таблицу существующих в базе данных комиксов как исключение

MikhailFerapontow commented 4 months ago

@vbelogrudov Я понял корень ошибки. Я неправильно понял как работает метод Do у http клиента. Он даёт err только в случае если response == nil. Что в случае Get запроса на 404 комикса неверно. Мы получаем:

<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>

При проверке на ResponseStatus я бездумно пробрасывал ошибку наверх, но он был nil. Поэтому ошибка не проверялась и пустой json с дефолтными значениями попадал в базу.