<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Cynthia Raphaella 💙</title>
    <description>The latest articles on DEV Community by Cynthia Raphaella 💙 (@cynthiaraphaela).</description>
    <link>https://dev.to/cynthiaraphaela</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F476974%2F2142d77b-4dd8-4250-9712-6c99606930ce.jpg</url>
      <title>DEV Community: Cynthia Raphaella 💙</title>
      <link>https://dev.to/cynthiaraphaela</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cynthiaraphaela"/>
    <language>en</language>
    <item>
      <title>Polly: uma biblioteca para resiliência em aplicações .NET</title>
      <dc:creator>Cynthia Raphaella 💙</dc:creator>
      <pubDate>Tue, 16 Mar 2021 17:57:13 +0000</pubDate>
      <link>https://dev.to/cynthiaraphaela/polly-uma-biblioteca-para-resiliencia-em-aplicacoes-net-3ko3</link>
      <guid>https://dev.to/cynthiaraphaela/polly-uma-biblioteca-para-resiliencia-em-aplicacoes-net-3ko3</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm6se7vmg17gnqbdeq739.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm6se7vmg17gnqbdeq739.jpeg" alt="Polly — biblioteca para tratamento de falhas em .Net"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Polly implementa diferentes padrões, que são chamados de Policies. Na &lt;a href="https://github.com/App-vNext/Polly#resilience-policies" rel="noopener noreferrer"&gt;documentação&lt;/a&gt; são apresentados os diferentes tipos e um resumo do uso de cada um deles. O livro &lt;a href="https://www.goodreads.com/book/show/1069827.Release_It_" rel="noopener noreferrer"&gt;Release It&lt;/a&gt; apresenta muitos desses conceitos com mais detalhes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configurando o Polly
&lt;/h2&gt;

&lt;p&gt;Configurar o Polly é bem simples, a biblioteca está disponível no &lt;a href="https://www.nuget.org/packages/Polly" rel="noopener noreferrer"&gt;NuGet&lt;/a&gt; e depois de instalada já está pronta para ser utilizada.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;dotnet add package Polly --version 7.2.1&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Retry Policy
&lt;/h2&gt;

&lt;p&gt;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:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uma condição que irá determinar uma possível repetição&lt;/li&gt;
&lt;li&gt;Uma função que pode ser executada múltiplas vezes. Essa função pode ser síncrona ou assíncrona&lt;/li&gt;
&lt;li&gt;O número máximo de vezes que a operação irá ser repetida. No caso do &lt;em&gt;RetryForever&lt;/em&gt;, esse parâmetro não é necessário e a execução vai se repetir até a condição ser falsa&lt;/li&gt;
&lt;li&gt;Um tempo de espera entre execuções &lt;em&gt;(WaitAndRetry)&lt;/em&gt;. Essa estratégia pode ajudar a aguardar o sistema se estabilizar&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O &lt;em&gt;Retry&lt;/em&gt; é muito útil para se recuperar de tratar falhas pontuais, como por exemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uma dependência externa indisponível&lt;/li&gt;
&lt;li&gt;O banco não respondeu&lt;/li&gt;
&lt;li&gt;Um token expirado&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Um cenário de uso do Retry
&lt;/h2&gt;

&lt;p&gt;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 &lt;em&gt;Retry&lt;/em&gt; pode ser utilizado para lidar com esse caso de falha. Abaixo temos um exemplo dessa implementação.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;No código estamos usando um método chamado &lt;em&gt;‘HandleTransientHttpError’&lt;/em&gt;, disponível em uma &lt;a href="https://github.com/App-vNext/Polly.Extensions.Http/blob/master/README.md" rel="noopener noreferrer"&gt;biblioteca de extensões do Polly&lt;/a&gt;, esse método agrupa algumas condições de falha comuns com o uso do &lt;em&gt;HttpClient&lt;/em&gt;. 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 &lt;em&gt;HttpRequestException&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Essa &lt;em&gt;policy&lt;/em&gt; criada executa a chamada para a dependência externa até duas vezes &lt;em&gt;(retryCount)&lt;/em&gt; se o resultado da chamada se encaixar na condição descrita acima. Como esse Retry é do tipo &lt;em&gt;WaitAndRetry&lt;/em&gt;, então antes de executar novamente, a &lt;em&gt;Policy&lt;/em&gt; vai aguardar um tempo determinado.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Neste &lt;a href="https://github.com/App-vNext/Polly-Samples" rel="noopener noreferrer"&gt;repositório&lt;/a&gt; existem vários exemplos práticos do uso do Polly&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/App-vNext/Polly/wiki/Retry" rel="noopener noreferrer"&gt;Wiki&lt;/a&gt; do Retry com mais detalhes&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>dotnet</category>
      <category>polly</category>
      <category>retrypolicy</category>
      <category>csharp</category>
    </item>
  </channel>
</rss>
