Resiliência em aplicações .Net Core com Polly
Neste post, vamos falar sobre o Polly e como ele pode ajudar a deixar nossas aplicações resilientes. Em alguns projetos da Iteris, temos utilizado bastante esta lib e obtido resultados realmente incríveis!
Primeiro, vamos ver a definição de resiliência:
resiliência
re·si·li·ên·ci·a
sf
1 FÍS Elasticidade que faz com que certos corpos deformados voltem à sua forma original. (Essa não)
2 FIG Capacidade de rápida adaptação ou recuperação. (Essa sim!!)
Como podemos ver acima, uma aplicação resiliente teria a capacidade de se adaptar e de se recuperar rapidamente diante de alguma adversidade, seja um problema de requisição à uma API, conexão com o banco de dados etc.
O Polly nos fornece algumas políticas (polices) que nos permite capturar problemas adversos e dar um tratamento a eles, seja de maneira reativa ou proativa. Abaixo, você pode vermais sobre as políticas padrões que temos utilizado. A partir da versão 7.0 do Polly, é possível criar novas políticas customizadas, adicionando ainda mais poder de adaptação e reação às aplicações.
Políticas reativas:
Retry e WaitAndRetry
Alguns problemas que ocorrem em nossa aplicação podem ser temporários, como uma indisponibilidade do banco de dados ou algum problema de rede que afete a comunicação com outros serviços. Para estes casos, tentando mais uma vez ou depois de algum tempo, pode ser que consigamos o resultado desejado e que essas duas políticas nos ajudem justamente a criar esse comportamento.
Podemos determinar a política e quais exceções irão disparar a execução e o número de tentativas. Para o WaitAndRetry, ainda podemos determinar um intervalo de tempo que o processo irá respeitar entre as tentativas.
Essa é, ao mesmo tempo, uma das políticas mais simples do Polly, mas uma das mais eficientes.
Circuit Breaker
Esta política monitora a quantidade de falhas que aconteceram na requisição. Caso elas superem o limite que configuramos, o circuito ficará “aberto” e não vai aceitar mais solicitações até que, após um determinado tempo, a política verifique novamente e “feche” o circuito se estiver tudo normalizado.
Em situações onde temos uma comunicação com outro sistema e o mesmo se encontra offline ou sobrecarregado, esta política é muito útil, já que evita tentativas desnecessárias, evitando que sobrecarreguemos ainda mais um sistema já sobrecarregado.
Fallback
O Polly permite que se encadeie diversas políticas para montar uma estratégia de resiliência. O Fallback fica no último nível. Caso todas as outras falhem, esta política é acionada para dar um tratamento à falha e responder de forma adequada ao cliente.
O Fallback é, ao mesmo tempo, uma política reativa e proativa, pois podemos configurar quais exceções ele irá tratar e assim definir de forma proativa um resultado para elas. Por exemplo, além de utilizar o CircuitBreaker em um caso onde o banco de dados esteja indisponível, poderíamos incluir essa exceção no Fallback e responder de forma proativa, melhorando a experiência do usuário na nossa aplicação.
Políticas proativas:
Timeout
Esta é a mais simples das políticas proativas. Ela age dando uma resposta caso a duração de uma requisição ultrapasse o tempo configurado. O Timeout é útil principalmente para a experiência do usuário já que, se algo está levando mais tempo que o comum, ele não precisa esperar indefinidamente.
Bulkhead
Em um cenário ideal, nossa aplicação será escalonável para atender uma demanda maior. Porém, se algo falhar, nossa aplicação poderá ficar sobrecarregada. Neste cenário é que o Bulkhead aplica sua política, monitorando a quantidade de paralelismo e ações enfileiradas que, ao ultrapassar os limites configurados, irá rejeitar novas.
Cache
Tudo o que reduz o tráfego de rede e a duração geral das chamadas aumenta a resiliência e melhora a experiência do usuário. O armazenamento em cache oferece a capacidade de não fazer chamadas ou de obter respostas de um recurso de rede mais próximo. Esta política pode ser usada com caches locais ou distribuídos, como o Redis.
Conclusão
Como citado acima, temos que combinar várias dessas políticas para montar a nossa estratégia de resiliência. Podemos ter uma ou mais, compondo um registro de políticas para ser utilizado em diferentes necessidades da nossa aplicação. Nos próximos posts, falaremos um pouco mais sobre recomendações de como compor essas estratégias e montar um registro de políticas.
O projeto do Polly está disponível no GitHub: https://github.com/App-vNext/Polly. Consulte a Iteris para saber como podemos ajudar a tornar suas aplicações resilientes!