Timeout e Retries em C#: Resiliência com async/await
Resiliência com Retry e Circuit Breaker em C# Assíncrono
Quando trabalhamos com chamadas externas (APIs, serviços de terceiros ou até mesmo serviços internos em microsserviços), precisamos lidar com eventuais falhas que podem envolver indisponibilidade do serviço, lentidão ou erros de rede. Fazer com que seu código assíncronoRefatorando Código Síncrono para Assíncrono: Guia Passo a PassoDescubra como transformar código síncrono em assíncrono em C# com práticas detalhadas, garantindo performance e escalabilidade em suas aplicações. seja resiliente é essencial para evitar interrupções e proporcionar uma melhor experiência ao usuário. Dois padrões amplamente utilizados para lidar com esse cenário são o Retry
Timeout e Retries: Estratégias de Resiliência com Async/AwaitAprenda a usar Timeout e Retries com async/await em C# para garantir operações assíncronas robustas e melhorar a resiliência da sua aplicação. e
📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. o Circuit Breaker
🛡️ Circuit Breaker: Proteja seus Microservices de Falhas em Cascata!Descubra como implementar o Circuit Breaker em .NET 8 para sistemas resilientes. Aprenda estratégias de fallback e monitore o desempenho com eficácia!.
Nesta narrativa, abordaremos:
- O conceito de Retry
Timeout e Retries: Estratégias de Resiliência com Async/AwaitAprenda a usar Timeout e Retries com async/await em C# para garantir operações assíncronas robustas e melhorar a resiliência da sua aplicação. e
📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. como aplicá-lo em chamadas assíncronas.
- O conceito de Circuit Breaker
🛡️ Circuit Breaker: Proteja seus Microservices de Falhas em Cascata!Descubra como implementar o Circuit Breaker em .NET 8 para sistemas resilientes. Aprenda estratégias de fallback e monitore o desempenho com eficácia! e por que ele é vital para proteger serviços
Criando e Escalando Serviços no Docker SwarmDescubra como criar, gerenciar e escalar serviços no Docker Swarm, utilizando comandos simples para manter alta disponibilidade em seu cluster..
- Uma implementação de exemplo desses padrões em C# usando uma biblioteca
🎮 Projeto: Sistema de Gerenciamento de Biblioteca com OOP Puro!Descubra como desenvolver um sistema de biblioteca eficiente utilizando conceitos de Orientação a Objetos em C#. Mergulhe neste tutorial prático e desafiador! de resiliência.
Entendendo o Retry em Chamadas Assíncronas🔗
O padrão RetryTimeout e Retries: Estratégias de Resiliência com Async/AwaitAprenda a usar Timeout e Retries com async/await em C# para garantir operações assíncronas robustas e melhorar a resiliência da sua aplicação. tem como objetivo tentar executar a mesma operação mais de uma vez em caso de falhas temporárias. Em um cenário assíncrono
⚡ Async/Await: Programação Assíncrona sem Callbacks!Aprenda a aplicar Async/Await em C# para criar aplicações responsivas, evitar travamentos e melhorar a escalabilidade com exemplos práticos e dicas essenciais., isso significa que, se algo falhar, seu método não precisa retornar imediatamente uma exceção: ele pode aguardar um tempo (backoff) e tentar novamente, sem bloquear a thread principal.
Vantagens do Retry
- Tolerância a falhas temporárias: Se uma API estiver momentaneamente indisponível, um retry pode resolver o problema
🤝 GitHub Básico: Versionamento para Iniciantes!Descubra como o GitHub facilita colaboração, versionamento e organização de código com este tutorial prático e essencial para desenvolvedores iniciantes. sem intervenção do usuário.
- Melhor experiência
🌐 LinkedIn para Devs .NET: Perfil que Atrai Recrutadores!Aprenda a otimizar seu perfil LinkedIn com dicas essenciais para devs .NET. Conquiste oportunidades e destaque suas habilidades! do usuário: Em vez de erros
🎲 Desafio: Crie um Sistema de Login com Tratamento de Erros Robusto!Aprenda a criar um sistema de login robusto em C#, com tratamento de erros adequado, validação e segurança para evitar vulnerabilidades. imediatos, o sistema tenta resolver sozinho.
- Simples de implementar: Existem bibliotecas que facilitam bastante a configuração
Gerenciando Secrets e Configs em Docker SwarmAprenda a proteger credenciais, chaves e tokens com Docker Swarm. Gerencie Secrets e Configs de forma segura, garantindo integridade dos dados críticos. de quantas tentativas devem ser feitas e qual o intervalo entre elas.
Exemplo de Implementação de Retry
Uma forma de implementar Retry em código assíncronoRefatorando Código Síncrono para Assíncrono: Guia Passo a PassoDescubra como transformar código síncrono em assíncrono em C# com práticas detalhadas, garantindo performance e escalabilidade em suas aplicações. C# é utilizando a biblioteca Polly. Com ela, podemos configurar facilmente quantas tentativas
Timeout e Retries: Estratégias de Resiliência com Async/AwaitAprenda a usar Timeout e Retries com async/await em C# para garantir operações assíncronas robustas e melhorar a resiliência da sua aplicação. serão realizadas e em quais condições.
using Polly;
using Polly.Retry;
using System;
using System.Net.Http;
using System.Threading.Tasks;
public class RetryExample
{
private static readonly HttpClient _httpClient = new HttpClient();
// Exemplo de política: tenta 3 vezes, aguardando 2 segundos entre cada tentativa.
private static readonly AsyncRetryPolicy _retryPolicy = Policy
.Handle<HttpRequestException>()
.WaitAndRetryAsync(
retryCount: 3,
sleepDurationProvider: attempt => TimeSpan.FromSeconds(2),
onRetry: (exception, timeSpan, retryCount, context) =>
{
Console.WriteLine($"Tentativa {retryCount} falhou. Retentando em {timeSpan.TotalSeconds}s...");
});
public static async Task<string> GetDataWithRetryAsync(string url)
{
return await _retryPolicy.ExecuteAsync(async () =>
{
var response = await _httpClient.GetAsync(url);
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
});
}
}
Nesse exemplo:
- Configuramos uma política para
🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! tratar apenas
HttpRequestException
, que é comum em cenários📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. de comunicação HTTP.
- Se ocorrer uma falha, tentamos novamente até 3 vezes, esperando 2 segundos entre cada tentativa.
- Se todas as tentativas
Timeout e Retries: Estratégias de Resiliência com Async/AwaitAprenda a usar Timeout e Retries com async/await em C# para garantir operações assíncronas robustas e melhorar a resiliência da sua aplicação. falharem, a exceção será propagada para o chamador.
Entendendo o Circuit Breaker em Chamadas Assíncronas🔗
Às vezes, para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! além de retentar operações, precisamos proteger nosso sistema de um comportamento repetitivo que pode agravar falhas. É aí que entra o Circuit Breaker
🛡️ Circuit Breaker: Proteja seus Microservices de Falhas em Cascata!Descubra como implementar o Circuit Breaker em .NET 8 para sistemas resilientes. Aprenda estratégias de fallback e monitore o desempenho com eficácia!. Esse padrão funciona como um disjuntor elétrico: se o número de falhas ultrapassa um certo limite (threshold), o circuito é aberto e novas requisições são bloqueadas temporariamente, reduzindo a sobrecarga
🎯 Sobrecarga de Métodos: Um Nome, Múltiplos Superpoderes!Aprenda sobre a técnica de sobrecarga de métodos no C# com exemplos e práticas recomendadas para melhorar a organização e legibilidade do seu código. no serviço ou integrando uma lógica de fallback.
Vantagens do Circuit Breaker
- Protege recursos
📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos.: Impede que múltiplas chamadas sejam enviadas para um serviço
Criando e Escalando Serviços no Docker SwarmDescubra como criar, gerenciar e escalar serviços no Docker Swarm, utilizando comandos simples para manter alta disponibilidade em seu cluster. que está claramente indisponível.
- Evita cascatas de falha: Facilita isolar problemas e
📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. diminuir impactos em outras partes do sistema.
- Proporciona tempos de recuperação: Quando um serviço
Criando e Escalando Serviços no Docker SwarmDescubra como criar, gerenciar e escalar serviços no Docker Swarm, utilizando comandos simples para manter alta disponibilidade em seu cluster. fica sobrecarregado, abrir o circuito por um tempo garante que ele possa se restabelecer.
Exemplo de Implementação de Circuit Breaker
Usando ainda a biblioteca🎮 Projeto: Sistema de Gerenciamento de Biblioteca com OOP Puro!Descubra como desenvolver um sistema de biblioteca eficiente utilizando conceitos de Orientação a Objetos em C#. Mergulhe neste tutorial prático e desafiador! Polly, configuramos uma política de Circuit Breaker
🛡️ Circuit Breaker: Proteja seus Microservices de Falhas em Cascata!Descubra como implementar o Circuit Breaker em .NET 8 para sistemas resilientes. Aprenda estratégias de fallback e monitore o desempenho com eficácia! assíncrona. Podemos combinar Retry
Timeout e Retries: Estratégias de Resiliência com Async/AwaitAprenda a usar Timeout e Retries com async/await em C# para garantir operações assíncronas robustas e melhorar a resiliência da sua aplicação. e
📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. Circuit Breaker
🛡️ Circuit Breaker: Proteja seus Microservices de Falhas em Cascata!Descubra como implementar o Circuit Breaker em .NET 8 para sistemas resilientes. Aprenda estratégias de fallback e monitore o desempenho com eficácia! para obter
📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. um grau maior de resiliência.
using Polly;
using Polly.CircuitBreaker;
using Polly.Retry;
using System;
using System.Net.Http;
using System.Threading.Tasks;
public class CircuitBreakerExample
{
private static readonly HttpClient _httpClient = new HttpClient();
// Policy de Retry para 3 tentativas
private static readonly AsyncRetryPolicy _retryPolicy = Policy
.Handle<HttpRequestException>()
.WaitAndRetryAsync(
retryCount: 3,
sleepDurationProvider: attempt => TimeSpan.FromSeconds(2),
onRetry: (exception, timeSpan, retryCount, context) =>
{
Console.WriteLine($"[RETRY] Tentativa {retryCount} com falha. Retentando em {timeSpan.TotalSeconds}s...");
});
// Policy de Circuit Breaker que "abre" o circuito se falhar 5 vezes consecutivas.
// Ele permanecerá aberto por 30 segundos.
private static readonly AsyncCircuitBreakerPolicy _circuitBreakerPolicy = Policy
.Handle<HttpRequestException>()
.CircuitBreakerAsync(
exceptionsAllowedBeforeBreaking: 5,
durationOfBreak: TimeSpan.FromSeconds(30),
onBreak: (ex, breakDelay) =>
{
Console.WriteLine($"[CIRCUIT BREAKER] Circuito aberto por {breakDelay.TotalSeconds}s. Motivo: {ex.Message}");
},
onReset: () =>
{
Console.WriteLine("[CIRCUIT BREAKER] Circuito fechado. Operações normalizadas.");
},
onHalfOpen: () =>
{
Console.WriteLine("[CIRCUIT BREAKER] Circuito em modo half-open. Teste de chamada em andamento...");
});
// Podemos encadear (wrap) Retry e Circuit Breaker para obter resiliência combinada.
private static readonly AsyncPolicyWrap _resiliencePolicy = Policy.WrapAsync(_retryPolicy, _circuitBreakerPolicy);
public static async Task<string> GetDataResilientAsync(string url)
{
return await _resiliencePolicy.ExecuteAsync(async () =>
{
var response = await _httpClient.GetAsync(url);
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
});
}
}
Como funciona esse encadeamento?
1. RetryTimeout e Retries: Estratégias de Resiliência com Async/AwaitAprenda a usar Timeout e Retries com async/await em C# para garantir operações assíncronas robustas e melhorar a resiliência da sua aplicação.: Tenta repetir a operação algumas vezes em caso de falha de rede momentânea.
2. Circuit Breaker🛡️ Circuit Breaker: Proteja seus Microservices de Falhas em Cascata!Descubra como implementar o Circuit Breaker em .NET 8 para sistemas resilientes. Aprenda estratégias de fallback e monitore o desempenho com eficácia!: Se as falhas continuarem após as retentativas, o circuito abre, pausando chamadas para evitar sobrecarregar o serviço
Criando e Escalando Serviços no Docker SwarmDescubra como criar, gerenciar e escalar serviços no Docker Swarm, utilizando comandos simples para manter alta disponibilidade em seu cluster..
Quando📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. o circuito está aberto, novas tentativas
Timeout e Retries: Estratégias de Resiliência com Async/AwaitAprenda a usar Timeout e Retries com async/await em C# para garantir operações assíncronas robustas e melhorar a resiliência da sua aplicação. são imediatamente interrompidas (lançando uma exceção ou usando fallback). Após o período configurado (neste caso, 30 segundos), o circuito passa para meio aberto (half-open). Nesse estado, apenas um número reduzido de tentativas
Timeout e Retries: Estratégias de Resiliência com Async/AwaitAprenda a usar Timeout e Retries com async/await em C# para garantir operações assíncronas robustas e melhorar a resiliência da sua aplicação. é permitido para verificar se o serviço está disponível novamente. Se a tentativa for bem-sucedida, o circuito é redefinido (reset) para
🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! fechado; do contrário, permanece aberto.
Boas Práticas de Utilização🔗
- Logging
📝 Logging com Serilog: Registre Tudo como um Detetive de Bugs!Aprenda a usar Serilog em .NET para registrar logs estruturados, identificar erros e enriquecer informações, transformando seu código num enigma solucionável.: Registre cada falha, abertura e
📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. fechamento de circuito. Isso ajuda na análise de problemas.
- Mensagens claras: Ao retentar ou abrir o circuito, disponibilize mensagens de erro claras para acompanhamento e monitoramento
🚀 Kubernetes: Orquestração de Microservices na Nuvem!Descubra como Kubernetes revoluciona o gerenciamento de microsserviços na nuvem, garantindo escalabilidade, automação e alta disponibilidade..
- Monitoramento
🚀 Kubernetes: Orquestração de Microservices na Nuvem!Descubra como Kubernetes revoluciona o gerenciamento de microsserviços na nuvem, garantindo escalabilidade, automação e alta disponibilidade.: Ferramentas de observabilidade
🚀 Kubernetes: Orquestração de Microservices na Nuvem!Descubra como Kubernetes revoluciona o gerenciamento de microsserviços na nuvem, garantindo escalabilidade, automação e alta disponibilidade. podem exibir o estado do circuito em dashboards, permitindo detectar instabilidades.
- Intervalos de Espera
Criando seu Primeiro Programa Assíncrono: do Zero ao DeployAprenda a configurar seu ambiente, criar e executar um projeto assíncrono em C# com async/await e prepare o deploy da sua aplicação com segurança. Adequados: Em ambientes de produção, o tempo de espera (backoff) pode ser exponencial para evitar saturar o serviço
Criando e Escalando Serviços no Docker SwarmDescubra como criar, gerenciar e escalar serviços no Docker Swarm, utilizando comandos simples para manter alta disponibilidade em seu cluster..
- Fallback: Você pode incluir métodos
🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!Otimize seu código em C# com métodos inteligentes. Aprenda práticas de reutilização, sobrecarga e escopo para melhorar a clareza e a eficiência. alternativos (fallback) em caso de falha, exibindo informações armazenadas em cache ou até mesmo mensagens amigáveis ao usuário informando indisponibilidade temporária.
Conclusão🔗
O uso combinado de RetryTimeout e Retries: Estratégias de Resiliência com Async/AwaitAprenda a usar Timeout e Retries com async/await em C# para garantir operações assíncronas robustas e melhorar a resiliência da sua aplicação. e
📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. Circuit Breaker
🛡️ Circuit Breaker: Proteja seus Microservices de Falhas em Cascata!Descubra como implementar o Circuit Breaker em .NET 8 para sistemas resilientes. Aprenda estratégias de fallback e monitore o desempenho com eficácia! de forma assíncrona fornece robustez a aplicações que dependem de múltiplos serviços. O Retry lida com problemas transitórios, enquanto o Circuit Breaker protege contra falhas prolongadas que podem prejudicar ainda mais o sistema. Ao adotar essas práticas em seus métodos assíncronos
Como Funciona o Operador 'await' e o que Significa 'async' nos MétodosAprenda a usar async e await em C# para processar tarefas demoradas sem bloquear sua aplicação. Torne o código legível e eficiente, melhorando a performance. C#, você ganha tanto em confiabilidade quanto em escalabilidade de suas soluções.
Bons códigos e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. muito sucesso ao projetar arquiteturas cada vez mais resilientes!
Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.
Referências🔗
- Documentação oficial do .NET sobre programação assíncrona, abordando conceitos que ajudam a compreender a implementação de operações assíncronas, como as apresentadas neste tutorial: learn.microsoft.com/pt-br/dotnet/csharp/programming-guide/concepts/async
- Repositório da biblioteca Polly, utilizada para implementar os padrões de Retry e Circuit Breaker assíncronos demonstrados no tutorial: github.com/App-vNext/Polly