Sobes.tech
Middle — Middle+

¿Cómo implementas una parada suave del servicio o aplicación para guardar el estado actual y finalizar sin pérdida de datos?

sobes.tech AI

Respuesta de la IA

Para implementar una parada suave de un servicio o aplicación en Go, generalmente se utilizan manejadores de señales del sistema operativo (por ejemplo, SIGINT, SIGTERM) y contextos con cancelación (context.Context). Esto permite finalizar correctamente las operaciones en curso, guardar el estado y liberar recursos.

Ejemplo:

package main

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

func main() {
    ctx, cancel := context.WithCancel(context.Background())

    // Manejo de señales para parada suave
    sigs := make(chan os.Signal, 1)
    signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)

    go func() {
        <-sigs
        fmt.Println("Se recibió una señal de parada, comenzando la finalización...")
        cancel() // Cancelar el contexto
    }()

    // Ejecutar lógica principal con soporte de cancelación
    run(ctx)
}

func run(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            // Guardar estado, liberar recursos
            fmt.Println("Guardando estado y finalizando")
            time.Sleep(2 * time.Second) // simulación de guardado
            return
        default:
            // Trabajo principal
            fmt.Println("Trabajando...")
            time.Sleep(1 * time.Second)
        }
    }
}

Este enfoque permite terminar el trabajo correctamente, sin perder datos ni interrumpir operaciones de forma forzada.