Back-End

2 ago, 2018

Conhecendo o Retry Pattern

Publicidade

Um erro comum ao migrarmos nossas aplicações para a nuvem, é esperarmos que a mesma funcione exatamente igual a quando hospedamos on-premises, porém,  com o poder da elasticidade oferecido pela nuvem. No entanto, acabamos encontrando erros transientes e difíceis de reproduzir.

Muitas vezes esses erros estão relacionados com a maneira que o provedor de nuvem alterna os recursos de hardware para melhor balanceamento de diversas cargas de trabalho. Durante esse período de reconfiguração, você pode enfrentar problemas de conectividade com o Banco de Dados SQL ou quando faz uma chamada à um serviço externo via http.

Sendo assim, devemos assumir que estes erros irão acontecer e preparar nossas aplicações para tratar erros transientes e efetuar uma nova tentativa à operação algum tempo depois (considerando milissegundos ou até mesmo segundos de delay).

Por ser um “erro” comum, já existe um padrão de projeto para o erro descrito anteriormente. Trata-se do Retry Pattern.

Padrão de projeto

Em engenharia de software, um padrão de projeto (do inglês design pattern) é uma solução geral reutilizável para um problema que ocorre com frequência dentro de um determinado contexto no projeto de software.

Retry Pattern:

Exemplo de implementação:

int tentativas = 3;
while(true) {
  try {
    ExecutarOperacao();
    break; // sucesso!
  } catch {
    if(--tentativas == 0) throw;
    else Thread.Sleep(1000);
  }
}

Repare que no exemplo anterior não estamos tratando a Exception e efetuando uma nova tentativa até um limite máximo de três tentativas. O ideal seria validar se trata-se de um erro transiente ou não, antes de tentar executar novamente.

Por exemplo:

int tentativas = 3;
while(true) {
  try {
    ExecutarOperacao();
    break; // sucesso!
  } catch(TimeoutException e) {
    if(--tentativas == 0) throw;
    else Thread.Sleep(1000);
  }
  catch {
      throw;
  }
}

Observação: os exemplos acima servem apenas para demonstrar como funciona o padrão de projeto e não devem ser usados em produção!

Para uso em produção, eu recomendo o uso de bibliotecas que forneçam maior flexibilidade para tratamento dos erros, número de tentativas e do delay. Você pode usar o The Transient Fault Handling Application Block da Microsoft ou a biblioteca Polly.

Muitas vezes o padrão de projeto Retry Pattern é usado em conjunto com o Padrão Circuit Breaker, para evitar novas chamadas à serviços que sabemos que estão fora do ar e/ou sobrecarregados.

Para maiores informações sobre o Circuit Breaker, acesse:

Até o próximo artigo, pessoal!