Circuit Breaker padrão: o que é e quando usar
O circuit breaker é um padrão de projeto que protege seu sistema contra falhas em cascata. Aprenda como ele funciona e em quais cenários faz sentido aplicar no seu código.
O circuit breaker é um padrão de projeto que protege seu sistema contra falhas em cascata. Aprenda como ele funciona e em quais cenários faz sentido aplicar no seu código.
O circuit breaker é um padrão de projeto que protege seu sistema contra falhas em cascata. Quando um serviço externo começa a falhar, ele interrompe as chamadas a esse serviço por um período, dando tempo para a recuperação e evitando que a falha se espalhe pelo sistema inteiro. É como um disjuntor elétrico: quando a corrente passa do limite, o circuito abre e interrompe o fluxo.
O padrão é especialmente útil em arquiteturas de microservices, onde uma falha em um serviço pode derrubar vários outros. Mas ele também se aplica a chamadas a bancos de dados, APIs externas e qualquer recurso que possa ficar indisponível.
Como funciona o padrão circuit breaker?
O circuit breaker tem três estados principais: fechado, aberto e meio-aberto.
No estado fechado, as chamadas fluem normalmente. O breaker monitora as falhas. Quando o número de erros consecutivos ou a taxa de erro passa de um limite configurado, o circuito abre.
No estado aberto, as chamadas são recusadas imediatamente, sem tentar acessar o serviço. Isso evita que o sistema fique esperando por um serviço que está fora. Após um tempo de espera, o breaker passa para o estado meio-aberto.
No estado meio-aberto, um pequeno número de chamadas é liberado para testar se o serviço se recuperou. Se as chamadas de teste funcionarem, o circuito fecha. Se falharem, ele abre novamente.
Quando usar circuit breaker no código?
Use circuit breaker quando você tem chamadas a serviços externos que podem falhar e causar impacto em cadeia. Por exemplo, em um microservice que depende de outro para buscar dados. Se o segundo serviço cai, o primeiro pode ficar acumulando requisições e derrubar também.
Também faz sentido usar quando o tempo de resposta do serviço externo é alto. Se o serviço demora demais, as threads do seu sistema ficam presas esperando. O circuit breaker evita esse acúmulo recusando as chamadas rapidamente.
Um caso concreto: um gateway de pagamento que está fora do ar. Sem circuit breaker, cada requisição tenta conectar e espera um timeout, que pode ser de 30 segundos. Com o padrão, após algumas falhas, o circuito abre e as requisições são recusadas na hora, liberando recursos.
Circuit breaker vs retry: qual a diferença?
O padrão retry tenta novamente uma operação que falhou, geralmente com espera entre tentativas. Ele é útil para falhas transitórias, como uma queda de rede momentânea.
O circuit breaker serve a uma finalidade diferente. Ele não tenta de novo. Ele interrompe as chamadas por um período, assumindo que o serviço está fora e que novas tentativas só vão piorar a situação.
Na prática, os dois padrões se complementam. Você pode usar retry para falhas temporárias e circuit breaker para falhas persistentes. Muitas bibliotecas, como Resilience4j e Hystrix, permitem combinar os dois.
Quais bibliotecas implementam circuit breaker?
Existem bibliotecas prontas para várias linguagens. No Java, o Resilience4j é uma opção leve e moderna. No .NET, o Polly é amplamente usado. Em Node.js, há o opossum.
Essas bibliotecas oferecem configuração refinada: limite de falhas, tempo de espera, estratégia de abertura e fechamento. Você não precisa implementar o padrão do zero, o que reduz erros e acelera o desenvolvimento.
Quais cuidados tomar ao usar circuit breaker?
O principal cuidado é configurar os limites corretamente. Um limite muito baixo abre o circuito com poucas falhas, interrompendo chamadas que poderiam funcionar. Um limite muito alto não protege o sistema.
Outro ponto: o tempo de espera no estado aberto. Se for curto demais, o circuito abre e fecha com frequência, causando instabilidade. Se for longo, o serviço pode ficar indisponível por mais tempo que o necessário.
Também é importante monitorar o comportamento do breaker. Sem métricas, você não sabe se ele está abrindo com frequência ou se os limites estão adequados.
Resumo
O circuit breaker é um padrão essencial para sistemas distribuídos que dependem de serviços externos. Ele evita falhas em cascata, reduz o tempo de espera em chamadas falhas e dá tempo para o serviço se recuperar. Use quando houver dependências críticas e configure os limites com base no comportamento real do sistema.
Perguntas frequentes
O que acontece quando o circuit breaker abre?
Quando o circuit breaker abre, as chamadas ao serviço são recusadas imediatamente, sem tentar acessar o recurso. Isso evita que o sistema acumule requisições e espere por timeouts longos. O circuito permanece aberto por um período configurado, depois passa para o estado meio-aberto para testar a recuperação.
Circuit breaker funciona para chamadas a banco de dados?
Sim, funciona. Se um banco de dados está lento ou fora do ar, o circuit breaker pode interromper as consultas e evitar que o aplicativo fique preso esperando. Isso é útil em cenários de alta carga, onde o banco pode ficar sobrecarregado e o sistema inteiro sofre.
Qual a diferença entre circuit breaker e timeout?
O timeout define o tempo máximo que uma chamada pode esperar por uma resposta. O circuit breaker monitora falhas e interrompe chamadas após um limite de erros. Eles são complementares: o timeout evita espera infinita, o circuit breaker evita chamadas repetidas a um serviço que está fora.
É necessário implementar circuit breaker em monólitos?
Depende. Se o monolito faz chamadas a APIs externas ou a serviços que podem falhar, o padrão ajuda. Para chamadas internas dentro do mesmo processo, o ganho é menor, pois a falha geralmente é tratada por exceções. Avalie se o serviço externo é crítico e se a falha pode causar impacto.
Como escolher os limites do circuit breaker?
Os limites devem refletir o comportamento real do sistema. Observe a taxa de erro normal, o tempo de resposta médio e a tolerância do usuário final. Comece com valores conservadores e ajuste com base em métricas de produção. Não existe uma configuração universal.
Circuit breaker substitui o padrão retry?
Não. São padrões complementares. O retry é para falhas transitórias, que podem ser resolvidas com uma nova tentativa. O circuit breaker é para falhas persistentes, onde novas tentativas só pioram a situação. Use retry primeiro e circuit breaker como proteção contra falhas repetidas.
Letícia Sampaio Khoury
Editora de Gadgets e Consumo Tech
Testa o gadget no dia a dia real, avalia se vale a grana sem deslumbre de novidade.
Ver todos os artigos →