Dejar de llamar
Preguntar a quien no va a contestar
A la una, Antifraude se cae otra vez, y esta vez va para largo: el equipo está restaurando una base de datos. Tarjetas ya sabe qué hacer sin él: riesgo acotado. Hasta 50 € se autoriza; por encima, se deniega.
Pero antes de llegar ahí, cada pago pregunta a Antifraude y espera su segundo de timeout. Veinte pagos por segundo, cada uno esperando un segundo para obtener una respuesta que ya conocemos, y veinte llamadas por segundo a un servicio que intenta levantarse.
Una persona haría lo obvio: después de que Antifraude falle unas cuantas veces seguidas, dejaría de llamarle un rato. Eso, en código, es un circuit breaker, como el diferencial de casa: cuando algo va mal, corta, y alguien tiene que comprobar que ya se puede volver a subir.
Cerrado, abierto, semiabierto
Veinte pagos por segundo. Si Antifraude no contesta en 1 s, riesgo acotado. A la derecha, un circuit breaker sobre la conexión, con su máquina de estados debajo; puedes cambiar cuántos fallos seguidos lo abren, cuánto tiempo se queda abierto y cuántas llamadas de prueba hace antes de cerrarse.
Pulsa Arrancar, deja que se vea el tráfico normal y pon Antifraude «caído». Luego vuelve a ponerlo sano y mira cómo se entera el breaker.
Qué ha pasado
Tres estados
Un circuit breaker envuelve las llamadas a una dependencia y lleva la cuenta de cómo van:
- Cerrado: el estado normal. Las llamadas pasan y el breaker cuenta los fallos seguidos. Un éxito pone la cuenta a cero.
- Abierto: tras N fallos seguidos, deja de llamar. Durante un tiempo, cada llamada falla al instante sin salir de Tarjetas, y el código pasa a la alternativa.
- Semiabierto: pasado ese tiempo, deja pasar unas pocas llamadas de prueba. Si todas salen bien, se cierra; si una falla, vuelve a abrirse otro rato.
Qué gana cuando Antifraude está caído
Con Antifraude caído, los dos paneles acaban decidiendo lo mismo: riesgo acotado.probar en el laboratorio Los denegados son casi idénticos. Lo que cambia es el camino:
- La espera. Sin breaker, cada pago espera su segundo de timeout: la clienta, en la caja, espera más de un segundo por una respuesta que Tarjetas podía dar al momento. Con el breaker abierto, la decisión se toma en milisegundos.
- La carga. Sin breaker, Antifraude sigue recibiendo veinte llamadas por segundo mientras intenta levantarse, y cada una ocupa algo en Tarjetas (una conexión, un hilo; recuerda el episodio 2). Con el breaker abierto, cero. Mira el minigráfico.
Es lo mismo que el episodio anterior pedía a los reintentos, pero llevado al extremo: si sabemos que va a fallar, lo más barato para todos es no intentarlo.
Qué pasa cuando vuelve
El breaker no sabe cuándo vuelve Antifraude: lo averigua probando.probar en el laboratorio Cuando acaba el tiempo abierto, pasa a semiabierto y deja pasar unas pocas llamadas. Si Antifraude sigue caído, solo esas pocas pagan el timeout y el breaker se abre otra vez. Si ha vuelto, se cierra y todo sigue como siempre.
Ese sondeo tiene un precio que se ve en el contador de denegados de más: entre que Antifraude vuelve y el breaker lo comprueba, se siguen denegando pagos grandes que Antifraude habría aprobado. Un tiempo abierto más corto lo acorta, a cambio de más llamadas de prueba a un servicio que quizá no ha vuelto. Es otro número que ajustar.
La alternativa es una decisión de negocio
Abrir el circuito solo sirve si hay algo razonable que hacer cuando está abierto. Aquí es el riesgo acotado: sin Antifraude, BCPS Bank asume el riesgo de autorizar hasta 50 € por pago y 150 € por tarjeta, y deniega el resto. Esos pagos quedan marcados y Antifraude los revisa cuando vuelve.
No lo decide el equipo de Tarjetas, lo decide el negocio: cuánto fraude está dispuesto a comerse el banco a cambio de que Ana pueda pagar el café. Los límites podrían ser otros (0 €, y se deniega todo; 200 €, y se arriesga más), y hay contextos donde la única alternativa honesta es fallar. Lo que no vale es que la alternativa la decida un timeout por accidente. Las redes de tarjetas reales hacen exactamente esto y lo llaman stand-in processing: cuando el banco emisor no contesta, la red autoriza por él con límites pactados de antemano.
Fíjate también en la diferencia entre denegado y fallido. Con riesgo acotado, un pago grande se deniega: es una decisión, rápida y con motivo, y la tienda puede ofrecer otra forma de pago. Sin alternativa, el pago falla: nadie ha decidido nada.
Cuándo hace daño: un umbral demasiado sensible
Ahora deja Antifraude sano, pero «con ruido»: cada seis segundos, un cuarto de segundo de errores (una pausa del recolector de basura, un despliegue, un nodo que se reinicia). Con un umbral de 3 fallos seguidos, el breaker se abre con cada pico.probar en el laboratorio
Cada apertura son cinco segundos de riesgo acotado con Antifraude perfectamente sano: pagos grandes denegados sin motivo (los «denegados de más») y el tope de 150 € de cada tarjeta gastándose. Mira la barra de Ana: se queda sin tope por un breaker nervioso, y cuando Antifraude está de verdad caído ya no le queda margen. Con un umbral de 10, el mismo ruido no abre nada.probar en el laboratorio
El umbral tiene que estar por encima de los errores normales del servicio. Por eso los breakers reales no suelen contar fallos seguidos, sino un porcentaje de fallos en una ventana (por ejemplo, más del 50 % de las últimas 100 llamadas), con un mínimo de llamadas para no decidir con dos datos.
Criterio
-
¿Es una dependencia remota que puede caerse un rato?Otro servicio, una base de datos, una API de terceros.candidata a breaker
-
¿Hay una alternativa razonable cuando está abierto?Riesgo acotado, un valor en caché, una respuesta degradada, un «inténtalo luego» rápido.breaker + alternativa
-
¿Conoces la tasa de errores normal del servicio?Sin ese dato, el umbral es una apuesta.umbral por encima de ella
Y cómo encaja con lo de los episodios anteriores:
| Pieza | Qué acota |
|---|---|
| Timeout y plazo (ep. 1) | Cuánto espera cada llamada |
| Compartimentos (ep. 2) | Cuántas esperan a la vez a una misma dependencia |
| Reintentos con backoff y jitter (ep. 3) | Cuánta carga extra genera cada fallo |
| Circuit breaker | Si se llama o no, cuando la dependencia está claramente caída |
Se usan juntos: el breaker cuenta como fallo el timeout de la llamada, los reintentos no deberían reintentar un «circuito abierto» (es un fallo que no se arregla en un segundo) y el compartimento protege mientras el breaker aún no se ha abierto.
En el mundo real
El patrón lo describió Michael Nygard en Release It! (2007) y Martin Fowler lo popularizó en su web. Netflix lo llevó a producción a gran escala con Hystrix; hoy, en Java, lo habitual es Resilience4j, cuyo CircuitBreaker abre por porcentaje de fallos o de llamadas lentas en una ventana (por número de llamadas o por tiempo), con un mínimo de llamadas, y tiene los tres estados de la simulación. En .NET, Polly ofrece lo mismo.
En las mallas de servicios, la idea equivalente es la outlier detection de Envoy e Istio: si una instancia concreta devuelve errores seguidos, se saca del balanceo un tiempo y luego se vuelve a probar. Es un breaker por instancia en lugar de por servicio.
Y en pagos, el stand-in processing de las redes de tarjetas es el mismo razonamiento aplicado a escala de industria: si el emisor no contesta, la red decide con límites pactados, y el emisor revisa después lo autorizado en su nombre.
Siguiente episodio
A las ocho de la tarde todo funciona. Antifraude está sano, Cuentas también. Y aun así Tarjetas se ahoga: empiezan las ofertas nocturnas y llegan más peticiones de las que puede atender, entre ellas las de un comercio cuya integración reintenta sin freno. Ya no hay ninguna dependencia a la que dejar de llamar: el problema está en la puerta.
Siguiente · Episodio 5 · 20:00 El pico de la noche Rate limiting por comercio y descarte por prioridades: decidir qué no atender para poder atender lo importante.