Implementando o Circuit Breaker Pattern – Parte 3

11 jul

Fala Galera,

Finalizando a série de posts sobre o padrão Circuit Breaker neste post final iremos falar sobre o Polly uma biblioteca open source que implementa o Retry Pattern e o Circuit Breaker.

Perdeu a segunda parte da série ? Clique aqui

A biblioteca Polly traz diversos recursos legais para o tratamento exceções como por exemplo:

  • Failure Threshold: Proporção de falhas que o circuito entra em estado de falha, por exemplo se configuramos em 0.5 representa que se o circuito falhar em 50% das ações o mesmo entra em estado de falha.
  • Sampling Duration: Taxa de falha considerada para executar ações durante um determinado período.
  • Minimum Throughput: Minimo de chamada ativas que passaram dentro do circuito para ele entrar em estado de falha
  • Duration Of Break: Tempo de duração que o circuito sai do estado de falha.

Agora que entendemos algumas configurações do Polly, vamos implementar nosso Circuit Breaker.

Talk is Cheap, Show me the Code!!

Neste exemplo vamos usar a biblioteca do Polly para tratar as exceções lançadas por um determinado serviço. Para usar o Polly, vamos adicionar no nosso projeto utilizando o NuGet através do comando abaixo:

Install-Package Polly

Com o Polly instalado, vamos configurar nosso circuito, para esse exemplo estarei usando dois recursos do Polly o Retry Pattern e o Circuit Breaker Pattern.

No exemplo estarei simulando uma requisição a um recurso externo e caso o recurso falhe o circuito entra em estado de aberto ou seja de falha.

static void Main(string[] args)
{

            var retry = Policy.Handle<WebException>()
                              .WaitAndRetryForever(attemp => TimeSpan.FromMilliseconds(300));

            var circuitBreakerPolicy = Policy.Handle<WebException>().CircuitBreaker(3, TimeSpan.FromSeconds(15), onBreak: (ex, timespan, context) =>
            {
                Console.WriteLine("Circuito entrou em estado de falha");
            }, onReset: (context) =>
            {
                Console.WriteLine("Circuito saiu do estado de falha");
            });

            while (true)
            {
                retry.Execute(() =>
                {
                    if (circuitBreakerPolicy.CircuitState != CircuitState.Open)
                    {
                        circuitBreakerPolicy.Execute(() =>
                        {

                            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost");

                            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                            using (Stream stream = response.GetResponseStream())
                            using (StreamReader reader = new StreamReader(stream))
                            {
                                var html = reader.ReadToEnd();
                                Console.WriteLine("Requisição feita com sucesso");
                                Thread.Sleep(300);
                            }

                        });
                    }

                });
            }
}

Neste código estou tentando acessar um recurso de um determinado endereço, por questão de exemplo estou acessando minha própria máquina quando eu paro o servidor web, o meu circuito entra em estado de falha e quando reinicio o servidor web ele volta ao estado de fechado.  A imagem abaixo reflete esse nosso exemplo.

O Polly é muito fácil de usar e contém diversas configurações que podemos usar para criar serviços resilientes a falha. Mais desta fantástica biblioteca pode ser encontrado na sua documentação através deste link.

Com isso encerramos nossa séries de posts de como Implementar um Circuit Breaker Pattern, espero que vocês tenham apreciado e claro conto com os comentários de vocês.

Abs e até a próxima.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *