Criando Aplicações Resilientes com Circuit Breaker

No post anterior, apresentamos o padrão de resiliência Retry. Mas o que acontece se o servidor de destino está falhando devido a uma sobrecarga? Fazer novas tentativas sobrecarregará ainda mais o servidor. É neste cenário que o padrão Circuit Breaker pode nos ajudar.

Em circuitos elétricos um circuit breaker (disjuntor) é um dispositivo que protege uma instalação elétrica de sobrecargas de corrente bem como curtos circuitos. Em sistemas distribuídos, a implementação do padrão circuit breaker ajudará a proteger o serviço de destino.

Esse padrão é mais complexo que o Retry pois se baseia numa maquina de estado como mostra a figura a seguir:

referência: Polly

Estados:

  • Closed/Fechado: em circuitos elétricos, quando um disjuntor está fechado indica que está passando corrente. No padrão de resiliência podemos dizer que está passando “requisições”;
  • Open/Aberto: neste estado, o circuito não passa as requisições ao destino, apenas retorna ao requisitante que o serviço está fora, evitando assim de sobrecarregar o destino com novas requisições, além de fornecer mais rapidamente um feedback, sem precisar aguardar o termino de uma requisição que provavelmente falhará. O circuito vai para o estado aberto após atingir um limite pré definido de falhas e permanecerá aberto também por um tempo definido; e
  • Meio aberto/Half-Open: esse é um estado de checagem, após esgotar o tempo no estado Aberto, o sistema vai para esse estado e a próxima requisição será encaminhada ao destino. Se o destino retornar falha, o circuito volta ao estado Aberto, se retornar com sucesso vai para o estado Fechado.

A animação a seguir ilustra o circuit breaker em ação com um limite (threshold) de duas falhas consecutivas para fazer a transição para o estado de Aberto:


Circuit Breaker com Polly

Novamente o Polly vem para facilitar a vida dos desenvolvedores na implementação do padrão circuit breaker em seus códigos, vejam como é simples:

No código, estamos configurando uma política de circuit breaker para quando houverem duas exceções (falhas) HttpRequestException consecutivas, o circuito pare de enviar requisições ao destino por 1 minuto. Durante esse período o circuito retornar uma BrokenCircuitException.

Observe no código que a política precisa ser a mesma instância entre as chamadas. Isso porque é necessário manter a instância da maquina de estado.

Vamos ver o código de um cliente consumindo esse serviço:

Temos a seguinte saída para o método Test_5_Calls:

Vejam que após a segunda chamada consecutiva com falha (HttpRequestException), o serviço passa a falhar rápido retornando umaBrokenCircuitException.


Configuração Avançada do Circuit Breaker

Imagine o cenário onde o serviço de destino está sendo balanceado e um dos servidores está sobrecarregado. Neste cenário, é provável que não teremos uma quantidade seguida de falhas para ativar o Circuit Breaker.

O framework Polly disponibiliza a política AdvancedCircuitBreaker que permitirá criar uma configuração mais robusta, na qual analisará uma amostragem de requisições durante um período e abrirá o circuito caso a quantidade de falhas atinja um certo percentual. Vale a pena explorar um pouco mais essa política.


Conclusão

A política de circuit breaker é muito importante para proteger o servidor de destino, bem como favorecer a experiência do usuário com uma falha rápida. A implementação dessa política com o Polly é relativamente simples.

Espero que tenham gostado, deixem seus feedbacks e continuem acompanhando.

Deixe uma resposta

O seu endereço de e-mail não será publicado.