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!