Continued from: MicroProfile overview
Fault Tolerance
Este es mi módulo de MicroProfile favorito, porque reduce la cantidad de código y proporciona funciones realmente interesantes para hacer que nuestra aplicación sea más resistente, incluidas estas políticas de tolerancia a fallas: Timeout
, Reintento
, Fallback
, Bulkhead
y CircuitBreaker
.
En el siguiente ejemplo, podemos ver cómo usar algunos de ellos.
@Timeout(value = 5000) @Retry(maxRetries = 3, delay=500) @Fallback(applyOn = CircuitBreakerOpenException.class, fallbackMethod = "getStockFallBack") @CircuitBreaker(successThreshold = 10, requestVolumeThreshold = 4, failureRatio=0.75,delay = 1000) public Stock getStock(String id){ URI apiUri = getURI(); StockClient stockClient = RestClientBuilder.newBuilder() .baseUri(apiUri) .build(StockClient.class); return stockClient.findById(id); } private Stock getStockFallBack(){ return null;//We can return a default, dummy, empty or placeholder result instead of null }
• La anotación @Timeout
evita esperar eternamente durante la ejecución del método.
• La anotación @Retry
invocará el método hasta tres veces, en caso de que ocurra un error, y cada invocación tendrá 300 ms de retraso. Esto es muy útil para recuperarse de una breve falla en la red.
• La anotación @CircuitBreaker
evita invocaciones repetidas de una lógica que falla constantemente. Por ejemplo, el otro servicio podría estar inactivo. Si de cuatro solicitudes, el 75% falla (o tres solicitudes fallan), entonces el circuito está abierto y esperará 1000 ms para abrirse; luego estará semi-abierto hasta 10 invocaciones exitosas o se abre nuevamente el circuito. Cuando se abre el circuito, se lanza una CircuitBreakerOpenException
.
• La anotación @Fallback
nos ayuda a recuperarnos de una excepción (inesperada, circuit-breaker, tiempo de espera y más). En el ejemplo, devolvemos un valor nulo cuando la aplicación recibe una excepción CircuitBreakerOpenException
.
Ahora vamos a ejecutar un escenario de falla. Si el stock-service
no funciona, dado que estamos usando las anotaciones de tolerancia a fallas, nuestra aplicación volverá a intentarlo tres veces. Esa llamada no excederá los cinco segundos, y después de tres fallas, se abre el corto-circuito (circuit-breaker), se activa la acción de respaldo (fallback) y, como resultado, tendremos un valor nulo.
Nuestros logs en consola muestran lo siguiente:
Getting stock for stockId 000001 has failed. The Circuit breaker is open|#] Getting stock for stockId 000002 has failed. The Circuit breaker is open|#] Getting stock for stockId 000003 has failed. The Circuit breaker is open|#]
Y el resultado JSON si llamamos al recurso list books (http://localhost:8080items-service/api/books/) se verá de la siguiente manera:
Por lo tanto, nuestra aplicación es lo suficientemente resistente para manejar problemas de red o incluso cuando otros servicios requeridos no funcionan, con un esfuerzo mínimo y solo agregando algunas anotaciones.