Back-End

18 jul, 2018

Implementando o Circuit Breaker Pattern – Parte 03

Publicidade

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!