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)