Middle+
Разкажи ми за последния провал — какво се случи, как го намериха и как го решиха?
sobes.tech AI
Отговор от AI
В един от последните ни проекти в Go се сблъскахме с проблем с изтичане на памет в услуга, която обработваше голям брой паралелни заявки. Системата започна постепенно да се забавя и накрая се срина с грешка за изчерпване на памет.
Причината беше неправилното използване на горутините: стартирахме горутина за всяка заявка, но не контролирахме тяхното завършване и не освобождавахме ресурсите, свързани с контекста.
Проблемът беше открит с помощта на профайлъра pprof, който показа увеличение на броя на горутините и потреблението на памет.
Решение:
- Добавихме контекст с таймаут и анулиране за горутините.
- Пренаписахме обработката на заявките, за да гарантираме завършването на горутините.
- Внедрихме пул от горутини за ограничаване на максималния брой едновременно работещи.
Пример за използване на контекст за анулиране на горутина:
ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
defer cancel()
go func(ctx context.Context) {
select {
case <-ctx.Done():
// почистване и завършване
return
// обработка
}
}(ctx)