Middle+
Parlami dell'ultimo fallimento — cosa è successo, come l'hanno trovato e come l'hanno risolto?
sobes.tech AI
Risposta dell'AI
In uno degli ultimi progetti in Go, abbiamo riscontrato un problema di perdita di memoria in un servizio che gestiva un gran numero di richieste parallele. Il sistema ha iniziato a rallentare gradualmente e alla fine è fallito con un errore di out-of-memory.
La causa è stata un uso scorretto delle goroutine: avviavamo una goroutine per ogni richiesta, ma non controllavamo la loro terminazione né liberavamo le risorse associate al contesto.
Il problema è stato rilevato con il profiler pprof, che ha mostrato un aumento del numero di goroutine e del consumo di memoria.
Soluzione:
- Abbiamo aggiunto un contesto con timeout e cancellazione per le goroutine.
- Abbiamo riscritto la gestione delle richieste per garantire la terminazione delle goroutine.
- Abbiamo implementato un pool di goroutine per limitare il numero massimo di goroutine in esecuzione.
Esempio di utilizzo del contesto per cancellare una goroutine:
ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
defer cancel()
go func(ctx context.Context) {
select {
case <-ctx.Done():
// pulizia e terminazione
return
// elaborazione
}
}(ctx)