Polly: uma biblioteca para resiliência em aplicações .NET
Tags: dotnet, polly, retrypolicy, csharp
Published: 2021-03-16 17:57:13


![Polly — biblioteca para tratamento de falhas em .Net](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m6se7vmg17gnqbdeq739.jpeg)

Aplicações complexas e com múltiplas dependências são suscetíveis a falhas. Normalmente existe uma preocupação em evitar que essas falhas aconteçam, mas também é importante saber se recuperar quando elas acontecem (sim, elas vão acontecer). Polly é uma biblioteca para aplicações .NET que foca em resiliência e tratamento de falhas.

Polly implementa diferentes padrões, que são chamados de Policies. Na [documentação](https://github.com/App-vNext/Polly#resilience-policies) são apresentados os diferentes tipos e um resumo do uso de cada um deles. O livro [Release It](https://www.goodreads.com/book/show/1069827.Release_It_) apresenta muitos desses conceitos com mais detalhes.

##Configurando o Polly
Configurar o Polly é bem simples, a biblioteca está disponível no [NuGet](https://www.nuget.org/packages/Polly) e depois de instalada já está pronta para ser utilizada.

`dotnet add package Polly --version 7.2.1`

##Retry Policy
Considerando os diferentes padrões disponíveis na biblioteca Polly, o Retry é o que eu mais utilizo. Esse padrão considera que a maioria das falhas que acontecem são transientes e que vão ser corrigidas automaticamente depois de um certo tempo. O Retry executa novamente um comportamento dada uma condição e é composto por algumas partes:
* Uma condição que irá determinar uma possível repetição
* Uma função que pode ser executada múltiplas vezes. Essa função pode ser síncrona ou assíncrona
* O número máximo de vezes que a operação irá ser repetida. No caso do _RetryForever_, esse parâmetro não é necessário e a execução vai se repetir até a condição ser falsa
* Um tempo de espera entre execuções _(WaitAndRetry)_. Essa estratégia pode ajudar a aguardar o sistema se estabilizar

O _Retry_ é muito útil para se recuperar de tratar falhas pontuais, como por exemplo:
* Uma dependência externa indisponível
* O banco não respondeu
* Um token expirado

##Um cenário de uso do Retry
Considerando como exemplo uma aplicação que tem um carrinho de compras, um dos requisitos é calcular o frete. Essa aplicação tem uma dependência externa que traduz o CEP em um endereço. A dependência não é muito estável e em alguns momentos retorna erros. Nesse cenário, o _Retry_ pode ser utilizado para lidar com esse caso de falha. Abaixo temos um exemplo dessa implementação.

{% gist https://gist.github.com/CynthiaRaphaella/f2f6c9f787e66d047ee4987496f728fa %}

No código estamos usando um método chamado _‘HandleTransientHttpError’_, disponível em uma [biblioteca de extensões do Polly](https://github.com/App-vNext/Polly.Extensions.Http/blob/master/README.md), esse método agrupa algumas condições de falha comuns com o uso do _HttpClient_. Internamente, essa condição valida se o retorno de uma requisição é um erro com um status code maior que 500 (indica um erro), 408 (timeout) ou uma exceção do tipo _HttpRequestException_.

Essa _policy_ criada executa a chamada para a dependência externa até duas vezes _(retryCount)_ se o resultado da chamada se encaixar na condição descrita acima. Como esse Retry é do tipo _WaitAndRetry_, então antes de executar novamente, a _Policy_ vai aguardar um tempo determinado.

O parâmetro de duração é configurado através de uma função, no exemplo acima, a Policy vai aguardar a quantidade de segundos relativa ao número daquela execução: na primeira tentativa um segundo, na segunda tentativa dois segundos.

Esse é um exemplo onde Polly pode ser utilizado para lidar com falhas em aplicações .NET. O código é simples e reutilizável e evita a implementação de uma camada de complexidade extra para lidar com falhas.

##Referências
* Neste [repositório](https://github.com/App-vNext/Polly-Samples) existem vários exemplos práticos do uso do Polly
* [Wiki](https://github.com/App-vNext/Polly/wiki/Retry) do Retry com mais detalhes