Definición
¿Conoces ese cuadro eléctrico en tu casa con los interruptores? Cuando hay un cortocircuito o demasiada carga en un circuito, el interruptor “salta” y corta la electricidad. Esto previene incendios y daños a tus electrodomésticos. Los circuit breakers en software hacen exactamente lo mismo - protegen tu sistema de colapsar cuando algo falla.
Imagina que tu aplicación de e-commerce necesita consultar un servicio de pagos para cada checkout. Si ese servicio de pagos se cae, ¿qué pasa? Sin un circuit breaker, cada intento de pago se queda esperando, agotando los tiempos de espera, acumulando peticiones pendientes, y eventualmente colapsando tu servidor porque está bloqueado esperando un servicio que no responde. Con un circuit breaker, después de algunos fallos, tu sistema dice “este servicio está caído, dejemos de llamarlo” y falla inmediatamente o usa un respaldo.
El circuit breaker tiene tres estados: Cerrado (todo normal, las peticiones pasan), Abierto (el servicio está caído, fallar inmediatamente sin intentar), y Medio-Abierto (dejar pasar algunas peticiones de prueba para ver si el servicio se ha recuperado). Es un patrón simple que previene que un servicio fallido arrastre a todo el sistema con él. Piénsalo como aislamiento de fallos - conteniendo el daño en lugar de dejarlo propagar.
Ejemplo
Microservicios de Netflix: Netflix ejecuta cientos de microservicios. Si el servicio de recomendaciones falla, no debería evitar que veas videos. Su circuit breaker detecta el fallo, deja de llamar al servicio de recomendaciones, y muestra una lista genérica de tendencias. El streaming continúa mientras las recomendaciones se recuperan.
Checkout de E-commerce: El checkout de un minorista llama a servicios de verificación de direcciones, cálculo de impuestos y procesamiento de pagos. Si el servicio de impuestos está respondiendo lentamente, un circuit breaker previene que los checkouts se acumulen. Podría usar tasas de impuestos cacheadas o mostrar un mensaje de “impuestos calculados en el recibo” mientras el servicio se recupera.
Integración de Pasarelas de Pago: Un sitio web soporta múltiples procesadores de pago. Cuando la pasarela principal falla 5 veces en un minuto, el circuit breaker se abre y el tráfico cambia automáticamente a una pasarela de respaldo. Los clientes ni notan la interrupción porque el sistema respondió a los fallos sin tiempos de espera largos.
Agregación de APIs: Un sitio de viajes agrega vuelos de múltiples aerolíneas. Si la API de una aerolínea se vuelve lenta, el circuit breaker la aisla, mostrando resultados de otras aerolíneas instantáneamente en lugar de esperar. Cuando la aerolínea lenta se recupera, se reintegra gradualmente.
Analogía
El Panel Eléctrico: El ejemplo clásico - cuando un cortocircuito ocurre o conectas demasiados electrodomésticos, el interruptor salta para prevenir un incendio. Lo resetes cuando se arregla el problema. Los circuit breakers de software funcionan idénticamente: detectan sobrecarga, cortan la conexión, y requieren una verificación antes de restaurar el servicio.
La Cocina del Restaurante: Cuando una estación de la cocina se atasca (digamos, la parrilla está respaldada con pedidos), un buen chef deja de enviar nuevos pedidos de parrilla a esa estación. En su lugar, actualiza a los clientes, ofrece alternativas, o acepta esperas más largas. No amontonan más pedidos hasta que la estación se desatasca. Eso es un circuit breaker para el flujo de trabajo del restaurante.
Triaje Hospitalario: Las salas de emergencia no colapsan cuando llega una ambulancia porque tienen sistemas para gestionar la sobrecarga. Si la cirugía está saturada, los nuevos pacientes de cirugía son desviados a otros hospitales o puestos en una cola diferente. El hospital continúa funcionando para otros pacientes mientras un departamento está abrumado. Los circuit breakers aplican la misma lógica a los servicios de software.
Tu Sistema Inmunológico: Cuando te infectas, tu cuerpo a veces desencadena fiebre para matar los patógenos. Es una respuesta que aísla el daño y previene la propagación. Los circuit breakers hacen esto para servicios - aislando componentes enfermos para que la enfermedad no se propague a través de todo el sistema.
Code Example
class CircuitBreaker {
private state: 'CLOSED' | 'OPEN' | 'HALF_OPEN' = 'CLOSED';
private failureCount = 0;
private lastFailureTime: number = 0;
private readonly threshold = 5;
private readonly timeout = 60000; // 60 segundos
async call<T>(fn: () => Promise<T>): Promise<T> {
if (this.state === 'OPEN') {
if (Date.now() - this.lastFailureTime > this.timeout) {
this.state = 'HALF_OPEN';
} else {
throw new Error('Circuit breaker está ABIERTO');
}
}
try {
const result = await fn();
this.onSuccess();
return result;
} catch (error) {
this.onFailure();
throw error;
}
}
private onSuccess(): void {
this.failureCount = 0;
this.state = 'CLOSED';
}
private onFailure(): void {
this.failureCount++;
this.lastFailureTime = Date.now();
if (this.failureCount >= this.threshold) {
this.state = 'OPEN';
}
}
}