Retry Pattern

Este padrão de desenvolvimento foi criado para tratar erros e exceções que são previstos e podem ocorrer, independentemente das precauções que o programador pode tomar.

Uma aplicação web que depende de um banco de dados pode implementar este padrão para, caso ocorra algum erro de comunicação com o banco de dados, tente novamente X vezes.

 

Situações que este padrão pode não se aplicar:

  • Quando o erro não é algo rápido, pois isso afetar diretamente a capacidade de resposta da aplicação. Pode ser que, ao aplicar este padrão, você esteja desperdiçando tempo e recursos em requisições que, provavelmente, vão falhar;
  • Tratar erros e exceções causados por erros em lógica de negócio;
  • Como uma alternativa para abordar problemas de escalabilidade em um sistema;

 

O exemplo abaixo não é dos mais simples, mas demonstra bem o padrão Retry:

public class Retrier<TResult> 
{
    public TResult Try(Func<TResult> func, 
        int maxRetries)
    {
        TResult returnValue = default(TResult);
        int numTries = 0;
        bool succeeded = false;
        while (numTries < maxRetries)
        {
            try
            {
                returnValue = func();
                succeeded = true;
            }
            catch (Exception)
            {
                //todo: figure out what to do here
            }
            finally
            {
                numTries++;
            }
            if (succeeded)
                return returnValue;
        }
        return default(TResult);
    }
 
    public TResult TryWithDelay(Func<TResult> func, int maxRetries, 
        int delayInMilliseconds)
    {
        TResult returnValue = default(TResult);
        int numTries = 0;
        bool succeeded = false;
        while (numTries < maxRetries)
        {
            try
            {
                returnValue = func();
                succeeded = true;
            }
            catch (Exception)
            {
                //todo: figure out what to do here
            }
            finally
            {
                numTries++;
            }
            if (succeeded)
                return returnValue;
            System.Threading.Thread.Sleep(delayInMilliseconds);
        }
        return default(TResult);
    }
}

 

 

Referências:

The following two tabs change content below.
Arquiteto de Software e Desenvolvedor Backend (quase Fullstack), geralmente trabalho com C#, PowerShell, Python, Golang, bash e Unity (esse é mais por hobby). Estou sempre buscando algo novo para aprender, adicionando novas ferramentas ao meu cinto de utilidades.
Posted in Conhecimento Técnico and tagged , , , .