Middle+
Cuéntame sobre el último fallo: qué pasó, cómo lo encontraron y cómo lo resolvieron?
sobes.tech AI
Respuesta de la IA
En uno de los últimos proyectos en Go, nos enfrentamos a un problema de fuga de memoria en un servicio que procesaba una gran cantidad de solicitudes paralelas. El sistema comenzó a ralentizarse gradualmente y finalmente falló con un error de falta de memoria.
La causa fue un uso incorrecto de las goroutines: lanzábamos una goroutine por cada solicitud, pero no controlábamos su finalización ni liberábamos los recursos asociados al contexto.
El problema fue detectado con el perfilador pprof, que mostró un aumento en el número de goroutines y en el consumo de memoria.
Solución:
- Añadimos un contexto con timeout y cancelación para las goroutines.
- Reescribimos el manejo de solicitudes para garantizar la finalización de las goroutines.
- Implementamos un pool de goroutines para limitar la cantidad máxima de goroutines en ejecución.
Ejemplo de uso de contexto para cancelar una goroutine:
ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
defer cancel()
go func(ctx context.Context) {
select {
case <-ctx.Done():
// limpieza y finalización
return
// procesamiento
}
}(ctx)