Falhas momentâneas (transient faults) é um conceito importante no desenvolvimento de aplicativos de alta disponibilidade e que possuem boa resiliência (ver outro post).

De modo geral, falhas momentâneas se caracterizam por serem falhas que em uma simples nova tentativa de execução já não mais percebe-se o problema. Possivelmente a falha não foi causada pela lógica da aplicação propriamente dita, mas sim por uma falha na infraestrutura (servidor, rede, gargalo, etc).

Em oposto às falhas momentâneas estão as falhas definitivas, onde não importa quantas tentativas de execução sejam feitas, sempre resultará em falha. Neste caso, provavelmente a falha está na lógica ou dados manipulados pelo aplicativo e não na infraestrutura que dá suporte ao aplicativo.

O grande desafio está em distinguir se uma falha que ocorreu é momentânea ou definitiva e então tratá-las de acordo.

Uma das formas de tentar fazer esta distinção é identificar as possíveis falhas momentâneas por códigos de erro ou tipos de exceções e então preparar o aplicativo para contornar estas falhas conhecidas.

Para contornar (tratar) estas falhas define-se uma estratégia, que pode variar de acordo com a funcionalidade que está sendo chamada ou mesmo de acordo com o tipo de falha momentânea.

Algumas estratégias utilizadas são:

  • Novas tentativas de execução a cada intervalo fixo de tempo, por exemplo, a cada 2 segundos;
  • Novas tentativas de execução em intervalos incrementais, por exemplo, a primeira tentativa 2 segundos após a falha, a segunda 4 segundos após a última tentativa, a terceira 6 segundos após a última tentativa e assim por diante;
  • Novas tentativas de execução em intervalos exponenciais e aleatórios, por exemplo, com 2 segundos, depois com 3.755 segundos, depois com 9.176 segundos e assim por diante.

Além disto, é comum ter um limite de tentativas, onde caso o limite seja atingido a falha momentânea torna-se uma falha definitiva, então é delegada ao aplicativo trata-la de outra forma, possivelmente avisando o usuário da ocorrência de uma falha.

Não irei descrever aqui, mas na plataforma Microsoft o Application Block “Transient Fault Handling” da Enterprise Library nos ajuda no tratamento de falhas momentâneas para alguns dos serviços do Windows Azure e permite extender. Para saber mais acesse a documentação do Enterprise Library.

Até mais.

Rafael Leonhardt

 

Referências: