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.
