Por que você deve usar Circuit Breaker?

Alguns anos atrás, participei da análise de uma falha que gerou bastante prejuizo para uma empresa de grande porte. O sistema caiu por completo — não por causa de um ataque, nem por erro no código — mas por algo mais sutil: um efeito dominó causado por falhas em serviços dependentes. Um microsserviço começou a falhar, os outros ficaram insistindo nas chamadas, o tráfego explodiu, ninguém conseguiu mais responder e… tudo foi ao chão. Literalmente.

Esse tipo de situação acontece com mais frequência do que deveria. E o pior: é evitável. Possuem algumas estratégias que em conjunto são necessárias, como retry/timout e também circuit breaker… mas hoje quero focar apenas no circuit Breaker.

Circuit Breaker é um pattern simples, mas que pode salvar a sua aplicação de cair inteira só porque um pedaço falhou.

Aliás, esse tipo de conteúdo é o que eu mais compartilho na Comunidade de Arquitetura Descomplicada (CaD), se tiver interesse em saber mais não deixe de acessar https://mugnos-it.com/cad/

Se você curte arquiteturas resilientes de verdade, vai se sentir em casa por lá.

O que é Circuit Breaker?

Se você já viu um disjuntor elétrico, sabe como ele funciona: quando algo dá errado, ele desliga o circuito para evitar um incêndio.

O Circuit Breaker na arquitetura de software faz a mesma coisa. Ele identifica quando um serviço ou componente começa a falhar repetidamente e, ao invés de deixar a aplicação continuar insistindo e quebrar tudo de vez, ele interrompe temporariamente as chamadas, protegendo o sistema.

Sem Circuit Breaker: o caos

Imagina um sistema de reserva de viagens, onde o backend central consulta serviços de avião, hotel e aluguel de carros. Se o serviço de carros cair, sem circuit breaker, a aplicação vai:

  • Tentar bater no serviço várias vezes;
  • Gastar threads e recursos com timeouts inúteis;
  • Gerar um retry storm, travando até quem estava funcionando;
  • Quando o serviço de carros tentar voltar, ele toma uma avalanche de requisições e… cai de novo.

Resultado? Todo o sistema começa a falhar — mesmo partes que estavam 100% saudáveis.

Com Circuit Breaker: controle

Com o pattern implementado, quando o serviço de carros cair, o breaker entra em estado “open” (Sim, open não quer dizer que esta passando requisição, aqui Open é igual circuit breaker eletrico, ele evita que a eletricidade passe). Ou seja: ele para de enviar requisições para aquele serviço por um tempo, retornando imediatamente com um fallback ou erro tratado.

Isso traz diversos benefícios:

  • Evita sobrecarga nos serviços falhos;
  • Preserva os recursos do sistema principal;
  • Garante resposta rápida ao usuário, mesmo em caso de falha;
  • Evita o famoso efeito dominó.

Como funciona na prática?

O Circuit Breaker tem três estados principais:

  • Closed (Fechado) – tudo normal, chamadas fluem normalmente.
  • Open (Aberto) – o serviço falhou N vezes, bloqueia chamadas por um tempo.
  • Half-Open – começa a testar devagar se o serviço voltou. Se sim, volta para fechado.

Exemplo real: um serviço caiu por instabilidade. O breaker entrou em open após 5 falhas. Esperou 30 segundos. Depois, entrou em half-open e enviou 2 requisições. Ambas deram sucesso. Voltou para closed e o sistema seguiu, sem crash, sem drama.

🧱 Onde implementar?

O ideal é implementar em camada de rede ou gateway, como:

  • Istio (Service Mesh)
  • Envoy
  • Spring Cloud Gateway
  • API Gateway de nuvem (ex: AWS, Azure)

Também pode ser implementado na aplicação com bibliotecas como Resilience4j, Hystrix (legado), ou middlewares próprios.

Mas atenção: não confunda Circuit Breaker com Rate Limiting ou Throttling!

  • Circuit Breaker ≠ limitar requisições
  • Circuit Breaker ≠ negar carga excessiva
  • Circuit Breaker = proteger o sistema de falhas conhecidas e constantes

🛠 Exemplos práticos de implementação

1. Istio (camada de rede)

Com Istio, você pode configurar circuit breakers diretamente no DestinationRule:

Esse exemplo ejetaria o serviço de carros da rota se ele responder 3 erros 5xx consecutivos em 5s.

2. Resilience4j (na aplicação)

No Spring Boot, por exemplo, é possível aplicar com Resilience4j de forma simples:

Simples, direto, e já com fallback amigável.

Dicas práticas

  • Combine com timeout e retry — bem calibrados.
  • Use métricas reais: % de falhas, latência, erro HTTP.
  • Fallbacks são essenciais (ex: cache, dummy response, fila).

Já vi Circuit Breaker salvar sistemas inteiros

Teve um caso em que, sem circuit breaker, uma aplicação global precisou bloquear o tráfego de usuários no firewall para conseguir se recuperar. Foi um desastre. (fiz uma aula dessa esses dias, aconteceu com o Canva)

Evitar isso com uma linha no gateway e um pattern bem aplicado teria feito toda a diferença.

Conclusão

Circuit Breaker é simples, poderoso e essencial em sistemas modernos.

Especialmente com arquiteturas distribuídas, microserviços, cloud e integrações externas — você não pode ignorar esse pattern.

Esse é o tipo de conhecimento que vai te poupar noites em claro, crises e prejuízos. E é exatamente o tipo de tema que a gente vive debatendo lá na Comunidade de Arquitetura Descomplicada (CaD).

👉 Quer entender mais, ver aulas práticas e aprofundar sua arquitetura? Conheça o CaD.

Abraços.

Douglas Mugnos!

guest
0 Comentários
Mais Velhos
Mais Novos Mais Votados
Inline Feedbacks
Veja todos comentários
0
Gostaria muito de saber sua opinião!x