Sobes.tech
Senior

¿Cómo debe diseñarse un servidor HTTP en Go para soportar una apagado suave y una limpieza adecuada de recursos?

sobes.tech AI

Respuesta de la IA

Para soportar un apagado ordenado en un servidor HTTP en Go, es necesario usar un contexto con cancelación y el método Shutdown del paquete net/http. Esto permite finalizar correctamente el procesamiento de las solicitudes actuales y liberar recursos antes de detener el servidor.

Ejemplo:

srv := &http.Server{Addr: ":8080", Handler: myHandler}

// Ejecutar el servidor en una goroutine
go func() {
    if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
        log.Fatalf("ListenAndServe(): %v", err)
    }
}()

// Esperar la señal de terminación
quit := make(chan os.Signal, 1)
signal.Notify(quit, os.Interrupt, syscall.SIGTERM)
<-quit

// Crear un contexto con un tiempo límite para la finalización
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

// Llamar a Shutdown para una parada ordenada
if err := srv.Shutdown(ctx); err != nil {
    log.Fatalf("Server Shutdown Failed:%+v", err)
}

log.Println("El servidor se cerró correctamente")

Este enfoque garantiza que el servidor no interrumpa las conexiones activas, sino que las finalice correctamente, libere recursos y termine su ejecución.