Sobes.tech
Middle+

Vertel me over de laatste fout — wat gebeurde er, hoe vonden ze het en hoe hebben ze het opgelost?

sobes.tech AI

Antwoord van AI

In een van onze laatste projecten in Go, stuitten we op een geheugenlek in een service die een groot aantal parallelle verzoeken verwerkte. Het systeem begon geleidelijk langzamer te worden en crashte uiteindelijk met een out-of-memory fout.

De oorzaak was een verkeerd gebruik van goroutines: we startten een goroutine voor elk verzoek, maar controleerden niet of ze eindigden en vrijgaven de resources die aan de context waren gekoppeld.

Het probleem werd ontdekt met behulp van de pprof profiler, die een toename in het aantal goroutines en het geheugengebruik liet zien.

Oplossing:

  • We voegden een context met timeout en annulering toe aan de goroutines.
  • We herschreven de verwerking van verzoeken om de beëindiging van goroutines te garanderen.
  • We implementeerden een goroutine pool om het maximale aantal gelijktijdige goroutines te beperken.

Voorbeeld van het gebruik van context om een goroutine te annuleren:

ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
defer cancel()
go func(ctx context.Context) {
    select {
    case <-ctx.Done():
        // opruimen en beëindigen
        return
    // verwerking
    }
}(ctx)