Dev (Back & Front)ARTIGO

Implementando o Circuit Breaker Pattern – Parte 03

O autor apresenta a terceira parte de sua série de artigos sobre a implementação do Circuit Breaker Pattern, desta vez, falando sobre o Polly, uma biblioteca open source que implementa o Retry Pattern e o Circuit Breaker.

Fala, galera!

Finalizando a série de artigos sobre o padrão Circuit Breaker, neste artigo 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 de 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 chamadas 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 este exemplo usarei dois recursos do Polly: o Retry Pattern e o Circuit Breaker Pattern.

No exemplo, simularei 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. Pelo propósito do 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 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 à falha. Mais desta fantástica biblioteca pode ser encontrado na sua documentação, através deste link.

Com isso encerramos nossa séries de artigos sobre a implementação de um Circuit Breaker Pattern. Espero que tenham apreciado, e claro, conto com os comentários de vocês.

Abraços e até a próxima!

Rafael CruzAutor

Rafael Cruz é Partner e Lead Software Architect na Electric Dreams, Professor Universitário, Most Valuable Profissional (MVP), Instrutor Oficial Microsoft (MCT), Fundador do Coders in Rio, Pós graduado em Engenharia de Software pela UFRJ. Atua como palestrante e autor em portais voltado para tecnologia Microsoft com foco em Web, Cloud e Mobile

Ver perfil