Advertisements

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.

Advertisements

• 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: 

list books resource

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.

Table of contents:

Advertisements

Pages: 1 2 3 4 5 6 7 8

Leave a Reply

Your email address will not be published. Required fields are marked *