Sobes.tech
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)