Patron de Monitoreo de Endpoints de Salud
Expone endpoints de salud ligeros para que orquestadores, balanceadores de carga y herramientas de monitoreo verifiquen la disponibilidad del servicio.
Nota para desarrolladores hispanohablantes: Esta guía incluye ejemplos y convenciones de nomenclatura adaptadas a equipos que trabajan en español. Cuando existen diferencias significativas en terminología técnica entre el inglés y el español, se indican explícitamente para facilitar la comunicación en equipos multiculturales.
Visión General
El Patron de Monitoreo de Endpoints de Salud expone endpoints ligeros que reportan si un servicio esta vivo y listo para recibir trafico. Los balanceadores de carga, orquestadores de contenedores y herramientas de monitoreo pueden consultar estos endpoints para decidir si enrutar trafico hacia una instancia o reiniciarla.
Este patron es la base de los sistemas auto-curativos y es esencial para cualquier servicio que se ejecute en un entorno dinamico donde las instancias pueden fallar o reiniciarse en cualquier momento.
Cuándo Usar
Usa este patron cuando:
- Ejecutes servicios en contenedores o detras de un balanceador de carga
- Quieras que un orquestador reinicie instancias no saludables automaticamente
- Necesites distinguir entre “el proceso esta corriendo” y “el servicio es usable”
- Quieras agregar health checks de dependencias sin modificar el codigo cliente
- Necesites mostrar datos de salud en un dashboard de monitoreo o sistema de alertas
Solución
// Endpoints de salud Express con probes de liveness y readiness
const express = require('express');
const app = express();
app.get('/health/live', (req, res) => {
res.status(200).json({ status: 'alive' });
});
app.get('/health/ready', async (req, res) => {
const dbHealthy = await checkDatabaseConnection();
const cacheHealthy = await checkCacheConnection();
if (dbHealthy && cacheHealthy) {
res.status(200).json({ status: 'ready' });
} else {
res.status(503).json({ status: 'not ready' });
}
});
app.listen(3000);
# Probes de liveness y readiness en Kubernetes
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-service
spec:
template:
spec:
containers:
- name: api
image: api:latest
livenessProbe:
httpGet:
path: /health/live
port: 3000
initialDelaySeconds: 10
periodSeconds: 15
readinessProbe:
httpGet:
path: /health/ready
port: 3000
initialDelaySeconds: 5
periodSeconds: 10
Explicación
Los endpoints de salud separan dos preocupaciones:
- Liveness: el proceso esta corriendo y no deberia reiniciarse. Si el liveness falla, el orquestador mata el contenedor e inicia uno nuevo.
- Readiness: el servicio esta listo para recibir trafico. Si el readiness falla, el balanceador deja de enviar solicitudes pero no reinicia la instancia.
Al verificar dependencias como bases de datos, caches y colas de mensajes, los probes de readiness evitan que el trafico llegue a una instancia que no puede atender solicitudes correctamente. Esto mejora la confiabilidad y reduce las tasas de error durante despliegues o interrupciones.
Variantes
| Endpoint | Proposito | Respuesta |
|---|---|---|
| Liveness | El proceso esta vivo? | 200 cuando corre, 500 en caso contrario |
| Readiness | Puede atender trafico? | 200 cuando las dependencias estan saludables, 503 en caso contrario |
| Startup | Ha terminado de iniciar? | 200 cuando la inicializacion completa |
| Deep health | Estado detallado de subsistemas | JSON con salud por dependencia |
Mejores Prácticas
- Manten el probe de liveness ligero y libre de dependencias
- Haz que el probe de readiness refleje la capacidad real de atender solicitudes
- Devuelve codigos de estado consistentes (
200saludable,503no saludable) - Evita operaciones pesadas en los health checks para prevenir falsos fallos
- Agrega timeouts y presupuestos de reintentos para verificaciones de dependencias
- Registra los fallos de health checks para debugging pero no satures los logs en cada llamada
Errores Comunes
- Usar un unico endpoint que devuelve OK incluso cuando el servicio esta roto
- Hacer que los health checks dependan de servicios externos que no son criticos
- Devolver
500para liveness, causando reinicios innecesarios - Olvidar probar los readiness probes durante los despliegues
- Exponer endpoints de salud publicamente sin autenticacion o rate limiting
Preguntas Frecuentes
P: Deberia un probe de liveness verificar la base de datos? R: No. Liveness solo debe verificar que el proceso esta corriendo. Si la base de datos esta caida, deberia fallar el readiness probe, no el liveness.
P: Que codigo de estado debe devolver un readiness probe cuando no esta saludable?
R: Debe devolver 503 Service Unavailable. Esto le indica al orquestador que deje de enrutar trafico sin reiniciar el contenedor.
P: Puedo exponer endpoints de salud a internet publica? R: Solo si no filtran informacion sensible. Los endpoints de deep-health internos deben estar protegidos por politicas de red o autenticacion.
Recursos Relacionados
Gateway Routing Pattern
Route requests to multiple backend services through a single entry point that handles cross-cutting concerns.
PatternAnti-Corruption Layer Pattern
Insert a translation layer between a bounded context and an external system to isolate domain models, prevent legacy constraints from leaking, and preserve semantic integrity.
PatternContent Delivery Network (CDN) Pattern
Distribute static and dynamic content through geographically dispersed edge servers to reduce latency, improve availability, and offload origin infrastructure.
GuideAPI Gateway Design — Resilience, Routing, and Security
A practical guide to designing API gateways: routing patterns, rate limiting, authentication, circuit breakers, and observability for resilient APIs.
PatternDatabase per Service Pattern
Give each microservice its own private database to ensure loose coupling, independent deployment, and technology heterogeneity across the application portfolio.