0Pricing
Go Academy · Lección

Gestión de errores y lógica de reintentos

Comprobación de códigos de estado e implementación de reintentos

Gestión de errores y lógica de reintentos 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.

Los errores HTTP no son errores de Go

Un estado HTTP 404 o 500 no es un error de Go: http.Client.Do devuelve un error nil para cualquier respuesta HTTP válida. Compruebe explícitamente resp.StatusCode.

Envoltorio de errores

Envuelva los errores con contexto usando fmt.Errorf("operation: %w", err) para que los llamadores puedan inspeccionar la causa con errors.Is / errors.As.

if err != nil {
    return fmt.Errorf("fetch users: %w", err)
}

Errores reintentables y no reintentables

Reintente en caso de tiempos de espera de red, 429 Too Many Requests y 503 Service Unavailable. No reintente en caso de 400 Bad Request, 401 Unauthorized y 404 Not Found: volver a intentarlo no ayudará.

Backoff exponencial

Espere más tiempo entre cada reintento para reducir la carga sobre un servidor con problemas. Una implementación sencilla:

for i := 0; i < maxRetries; i++ {
    resp, err := client.Do(req)
    if err == nil && resp.StatusCode < 500 { break }
    time.Sleep(time.Duration(math.Pow(2, float64(i))) * time.Second)
}

Jitter

Añada jitter aleatorio al backoff para evitar que varios clientes reintenten simultáneamente (efecto estampida).

wait := time.Duration(math.Pow(2, float64(i)))*time.Second + time.Duration(rand.Intn(1000))*time.Millisecond

Encabezado Retry-After

La respuesta 429 suele incluir un encabezado Retry-After. Analícelo y respételo en lugar de usar un backoff fijo.

retryAfter := resp.Header.Get("Retry-After")
if secs, err := strconv.Atoi(retryAfter); err == nil {
    time.Sleep(time.Duration(secs) * time.Second)
}

Reintentos sensibles al contexto

Compruebe el contexto antes de cada intento de reintento para dejar de reintentar si se canceló la solicitud.

for i := 0; i < maxRetries; i++ {
    if ctx.Err() != nil { return nil, ctx.Err() }
    // attempt
}

Tipos de error personalizados

Defina errores HTTP tipados que incluyan el código de estado y el cuerpo, para que los llamadores puedan tomar decisiones detalladas sobre los reintentos.

type HTTPError struct {
    Status int
    Body   string
}
func (e *HTTPError) Error() string { return fmt.Sprintf("HTTP %d: %s", e.Status, e.Body) }

Opciones de bibliotecas

Considere hashicorp/go-retryablehttp o cenkalti/backoff para implementar la lógica de reintentos en producción con políticas de backoff configurables, un número máximo de reintentos y compatibilidad con contextos.

Claves de idempotencia

Para las solicitudes POST que se reintentan, incluya un encabezado de clave de idempotencia (UUID) para que el servidor deduplique los reintentos y devuelva el mismo resultado sin crear recursos duplicados.

Disyuntor

Un disyuntor realiza un seguimiento de las tasas de error y deja de enviar solicitudes a un servicio que falla durante un periodo de enfriamiento. Bibliotecas como sony/gobreaker implementan este patrón.

Comprobación rápida

¿Por qué debería añadir jitter al backoff exponencial?

Resumen: gestión de errores y reintentos

Puntos clave:

  • Compruebe resp.StatusCode: los errores HTTP no son errores de Go
  • Reintente en caso de 429, 503 y tiempos de espera de red, pero no en errores de cliente 4xx
  • El backoff exponencial más jitter evita el efecto estampida
  • Compruebe siempre el contexto antes de reintentar

Preguntas frecuentes

¿La lección «Gestión de errores y lógica de reintentos» es gratis?

Sí — el texto completo de «Gestión de errores y lógica de reintentos» 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 «Gestión de errores y lógica de reintentos»?

Comprobación de códigos de estado e implementación de reintentos 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 «Gestión de errores y lógica de reintentos»?

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. Realización de solicitudes HTTP
  2. Configuración de tiempos de espera y headers
  3. Decodificación de respuestas JSON
  4. Gestión de errores y lógica de reintentos
← Volver a Go Academy