¿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:
-
Manejo de señales del sistema operativo — capturan las señales de terminación (
SIGINT,SIGTERM) mediante un canal ysignal.Notify. -
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.
-
Cancelación del contexto — utilizan
context.Contextcon cancelación para transmitir la señal de parada a todas las goroutines. -
Cierre de recursos — cierran conexiones abiertas a bases de datos, archivos, conexiones de red.
-
Espera a que las goroutines terminen — mediante
sync.WaitGroupu 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.