.NET

1 ago, 2018

Resiliência em suas aplicações .NET Core

716 visualizações
Publicidade

Olá, pessoal!

Em algumas aplicações podemos ter problemas de requisições para um serviço, API ou conexão com a base, e com isso, algum erro é retornado para o usuário. Mas e se implementarmos um controle de tentativas de execução dessas chamadas?

Sim, isso é possível! Aplicar resiliência em suas aplicações utilizando a biblioteca Polly.

Primeiro, vamos entender o que é Resiliência. Fazendo uma pesquisa no dicionário, ele me diz isso:

2. fig. capacidade de se recobrar facilmente ou se adaptar à má sorte ou às mudanças.

O que isso quer dizer? Vamos falar no cenário de um sistema que precisa mandar dados para uma API, e a mesma não se encontra disponível. Possivelmente você mandará e retornará uma exceção, dizendo que o envio não aconteceu, e provavelmente você terá que reenviar manualmente essa requisição para a API.

Utilizando resiliência, conseguimos configurar, por exemplo, caso nesta primeira tentativa de envio sem sucesso, a quantidade de tentativas da requisição da informação para API de forma automática.

Utilizando o Polly, temos várias maneiras de utilizar resiliência. Todas elas você encontra na documentação no GitHub.

Neste artigo vou abordar quatro delas, que são:

  • Retry
  • Fallback
  • Wait and Retry
  • Circuit Breaker

Retry

Fluxo do Retry

O mais simples deles, como o próprio nome diz, re-tentativa. Caso sua requisição falhe, automaticamente ele irá reenviar sua requisição.

O mais interessante é que você pode configurar a quantidade de vezes que essa requisição pode ser reenviada, e caso acabem as re-tentativas, você poderá logar, dizendo que as tentativas foram excedidas e aquela requisição teve falha de envio.

Veja que no código acima, tenho configurado a quantidade de vezes que quero que a requisição seja executada caso dê erro.

Note que tenho no callback do método a propriedade exception, que é o erro que aconteceu na requisição da API e retryCount, que é o contador de quantas vezes aquela requisição foi executada.

Wait and Retry

Fluxo Wait and Retry

No mesmo conceito do Retry, onde determinados a quantidade de vezes para o reenvio da requisição para a API caso dê erro, podemos configurar também o tempo entre um envio e outro.

Como no Retry, caso acabe a quantidade de vezes configurada, é retornado erro, e o fluxo se acaba.

Fallback

Fluxo Fallback

Um pouco diferente dos demais, o Fallback tem a função que caso dê tudo errado em sua requisição, ele retorna algo customizado.

Por exemplo, estamos tentando obter uma imagem da foto do usuário, caso não consiga retornar, retornamos uma imagem padrão.

Circuit Breaker

Fluxo do Circuit Breaker

No Circuit Breaker ou Disjuntor, depois de todas as tentativas de requisição excedidas, um circuito é aberto. Logo após estar no estado aberto, há um tempo de espera configurado onde o circuito entra no estado meio aberto e novamente tenta o sucesso da requisição. Caso dê erro, o estado é retornado para aberto, e aguarda o tempo configurado para entrar no estado meio aberto.

Caso dê sucesso no estado de meio aberto, o circuito é fechado.

Dependendo da sua aplicação, esse controle de resiliência é importante, pois hoje em dia não queremos perder nenhuma informação. Conseguimos ter com resiliência uma rastreabilidade do que aconteceu de verdade  com as requisições, com certeza aplicando um log em cada passo aplicado com o Polly.

Espero que tenham gostado desse artigo!

Até a próxima!