Sobes.tech
Middle+

Spune-mi despre ultimul eșec — ce s-a întâmplat, cum l-au găsit și cum l-au rezolvat?

sobes.tech AI

Răspuns de la AI

În unul dintre ultimele noastre proiecte în Go, ne-am confruntat cu o problemă de scurgere de memorie într-un serviciu care procesa un număr mare de cereri paralele. Sistemul a început să încetinească treptat și în cele din urmă a eșuat cu o eroare de tip out-of-memory.

Cauza a fost o utilizare incorectă a goroutine-urilor: lansam o goroutine pentru fiecare cerere, dar nu controlam finalizarea acestora și nu eliberam resursele asociate cu contextul.

Problema a fost detectată cu ajutorul profiler-ului pprof, care a arătat o creștere a numărului de goroutine-uri și a consumului de memorie.

Soluție:

  • Am adăugat un context cu timeout și anulare pentru goroutine-uri.
  • Am rescris procesarea cererilor pentru a garanta finalizarea goroutine-urilor.
  • Am implementat un pool de goroutine-uri pentru a limita numărul maxim de goroutine-uri care rulează simultan.

Exemplu de utilizare a contextului pentru anularea unei goroutine:

ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
defer cancel()
go func(ctx context.Context) {
    select {
    case <-ctx.Done():
        // curățare și finalizare
        return
    // procesare
    }
}(ctx)