Sobes.tech
Middle — Middle+

¿Cuál es la secuencia de acciones necesaria para detener correctamente la aplicación sin pérdida de datos o fallos?

sobes.tech AI

Respuesta de la IA

Para detener correctamente una aplicación Go sin pérdida de datos ni fallos, generalmente se siguen los siguientes pasos:

  1. Manejo de señales del sistema operativo — capturan las señales de terminación (SIGINT, SIGTERM) mediante un canal y signal.Notify.

  2. Inicio de apagado suave (graceful shutdown) — se inicia un proceso de cierre suave, que deja de aceptar nuevas solicitudes y permite que las existentes finalicen.

  3. Cancelación del contexto — utilizan context.Context con cancelación para transmitir la señal de parada a todas las goroutines.

  4. Cierre de recursos — cierran conexiones abiertas a bases de datos, archivos, conexiones de red.

  5. Espera a que las goroutines terminen — mediante sync.WaitGroup u otros mecanismos, esperan a que todas las operaciones finalicen.

Ejemplo de manejo de señal y apagado suave:

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

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    var wg sync.WaitGroup

    // Inicio de la aplicación
    wg.Add(1)
    go func() {
        defer wg.Done()
        runApp(ctx) // función con la lógica principal
    }()

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

    <-sigs // esperamos la señal
    cancel() // cancelamos el contexto, señalando a las goroutines

    // Esperamos a que terminen
    done := make(chan struct{})
    go func() {
        wg.Wait()
        close(done)
    }()

    select {
    case <-done:
        // Todos terminaron
    case <-time.After(10 * time.Second):
        // Tiempo de espera agotado
    }
}

Este enfoque ayuda a evitar pérdida de datos y cierres incorrectos.