Sobes.tech
Middle+

Πες μου για το τελευταίο λάθος — τι συνέβη, πώς το βρήκαν και πώς το λύσανε;

sobes.tech AI

Απάντηση από AI

En uno de nuestros ú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 el número máximo 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)