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!









