0Pricing
Go Academy · Lección

Apagado ordenado

Gestión de señales del sistema operativo y drenaje de conexiones

Apagado ordenado es una lección gratuita de Go Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Go Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Go Academy incluye 4 lecciones en total.

¿Por qué realizar un apagado ordenado?

Llamar a os.Exit o simplemente detener el servidor descarta todas las solicitudes en curso. El apagado ordenado espera a que finalicen las solicitudes activas antes de salir.

http.Server.Shutdown

srv.Shutdown(ctx) deja de aceptar conexiones nuevas, espera a que finalicen las solicitudes activas y después retorna. Pase un contexto con un plazo para limitar el tiempo de espera.

ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
srv.Shutdown(ctx)

Gestión de señales

Escuche SIGINT/SIGTERM en una goroutine y llame a Shutdown cuando se reciba:

quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
log.Println("shutting down...")
srv.Shutdown(ctx)

Patrón completo de apagado ordenado

Inicie el servidor en una goroutine; bloquee la ejecución en el canal de señales y, después, apáguelo:

go func() {
    if err := srv.ListenAndServe(); err != http.ErrServerClosed {
        log.Fatal(err)
    }
}()

quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
srv.Shutdown(ctx)

http.ErrServerClosed

Después de llamar a Shutdown, ListenAndServe devuelve http.ErrServerClosed. Trátelo como una salida normal, no como un error.

Drenaje de conexiones

Shutdown espera a que finalicen todas las conexiones interceptadas y las conexiones WebSocket activas solo si el propio controlador respeta la cancelación del contexto. Los controladores de long polling o streaming deben comprobar r.Context().Done().

Tiempo de espera del apagado

Establezca un tiempo de espera razonable para el apagado (10-30 s). Si todavía hay solicitudes en ejecución cuando vence el plazo, Shutdown devuelve context.DeadlineExceeded y las conexiones restantes se cierran por la fuerza.

Limpieza durante el apagado

Después de que retorne Shutdown, cierre los pools de conexiones de la base de datos, vacíe los búferes de registros y libere los demás recursos en orden. Use defer o una secuencia explícita.

srv.Shutdown(ctx)
db.Close()
logger.Sync()

Server.Close frente a Server.Shutdown

srv.Close() cierra inmediatamente todas las conexiones sin esperar. Úselo solo cuando sea aceptable una detención forzada (por ejemplo, en pruebas).

Sonda de disponibilidad de Kubernetes

Durante el apagado, actualice la sonda de disponibilidad para que devuelva 503 antes de llamar a Shutdown. Esto indica al balanceador de carga que deje de dirigir solicitudes nuevas al pod.

Varios servidores

Si ejecuta varios servidores (HTTP + gRPC + métricas), apague cada uno de forma concurrente mediante goroutines y use un WaitGroup para esperar a que todos terminen de drenar.

Comprobación rápida

¿Qué hace http.Server.Shutdown?

Resumen: apagado ordenado

Puntos clave:

  • srv.Shutdown(ctx) detiene las conexiones nuevas y espera a que finalicen las activas
  • Escuche SIGINT/SIGTERM con signal.Notify
  • ListenAndServe devuelve http.ErrServerClosed durante el apagado; no es un error
  • Establezca un plazo para el apagado para evitar esperas indefinidas

Preguntas frecuentes

¿La lección «Apagado ordenado» es gratis?

Sí — el texto completo de «Apagado ordenado» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Go Academy, actualiza a CoddyKit PRO. El curso de Go Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Apagado ordenado»?

Gestión de señales del sistema operativo y drenaje de conexiones Practicas Go Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Go Academy?

No se requiere experiencia previa. Go Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Apagado ordenado»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Go Academy?

Sí. Cada lección de Go Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Creación de un servidor HTTP
  2. Enrutamiento y parámetros de ruta
  3. Patrón de middleware
  4. Apagado ordenado
← Volver a Go Academy