En arquitecturas distribuidas, el manejo de errores debe ser centralizado, predecible y resistente a varios tipos de fallos que son inevitables al trabajar con servicios de red. Se recomienda utilizar patrones como Retry, Circuit Breaker, Timeout, Fallback y logging/monitorización centralizados.
Principios:
Ejemplo de Circuit Breaker en Python usando la biblioteca pybreaker:
import pybreaker import requests breaker = pybreaker.CircuitBreaker(fail_max=3, reset_timeout=60) @breaker def get_data(): return requests.get('http://service/api/data', timeout=3) try: response = get_data() except pybreaker.CircuitBreakerError: # fallback: devolver un placeholder o error response = 'Datos de Fallback'
Características clave:
¿Se pueden dar todos los detalles de la excepción al cliente en caso de errores?
No. Los detalles de las excepciones no deben ser revelados, ya que representan una amenaza a la seguridad. En las respuestas, solo devolvemos información general; los detalles técnicos se registran en sistemas internos.
¿Es suficiente implementar solo un "retry" en caso de errores de red entre servicios?
No, un "retry" puro puede agravar el problema; es recomendable implementar una estrategia con backoff (retraso creciente), en lugar de intentos rigidamente repetidos.
¿Es mejor almacenar los logs en el disco local de cada microservicio?
No. La mejor opción es la recolección centralizada de logs (por ejemplo, usando ELK, Loki, Grafana), para que todos los logs sean accesibles para búsqueda y análisis en un único punto.