Sobes.tech
Senior

¿Cómo implementar un apagado ordenado? ¿Cómo saber cuándo es momento de hacer un apagado ordenado?

sobes.tech AI

Respuesta de la IA

El apagado ordenado (graceful shutdown) es la finalización correcta de una aplicación, en la que esta logra completar las operaciones en curso, liberar recursos y cerrar las conexiones de manera adecuada.

En Go, esto generalmente se implementa mediante la captura de señales del sistema (por ejemplo, SIGINT, SIGTERM) usando el paquete os/signal. Cuando la aplicación recibe una señal de terminación, inicia el proceso de apagado ordenado.

Ejemplo:

import (
    "context"
    "fmt"
    "net/http"
    "os"
    "os/signal"
    "syscall"
    "time"
)

func main() {
    srv := &http.Server{Addr: ":8080"}

    // Canal para señales
    quit := make(chan os.Signal, 1)
    signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)

    go func() {
        <-quit
        fmt.Println("Apagando el servidor...")

        ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
        defer cancel()

        if err := srv.Shutdown(ctx); err != nil {
            fmt.Println("El servidor fue forzado a apagarse:", err)
        }
    }()

    if err := srv.ListenAndServe(); err != http.ErrServerClosed {
        fmt.Println("Error del servidor:", err)
    }

    fmt.Println("El servidor se cerró correctamente")
}

Entender cuándo es momento de hacer un apagado ordenado puede basarse en señales del sistema operativo o eventos internos (por ejemplo, comando del administrador, superación de límites, errores). Normalmente, esto se detecta mediante señales externas de terminación del proceso.