Microsserviços: Padrão Circuit Breaker para melhorar a resiliência
Atualizado
Isto foi útil?
Atualizado
Isto foi útil?
A arquitetura de microsserviços distribui aplicações em vários serviços, introduzindo desafios em suas interações. Falhas — sejam devido a problemas de rede, falhas em contêineres ou sobrecarga de serviços — são inevitáveis e podem interromper cadeias inteiras de operações. O padrão Circuit Breaker aborda esses desafios isolando serviços com falhas para evitar erros em cascata, garantindo que outros serviços permaneçam operacionais.
Este caso de uso demonstra como a implementação desse padrão pode aumentar a resiliência e minimizar interrupções em suas integrações. Ao final deste artigo, você aprenderá como a Digibee pode ajudá-lo a implementar o padrão Circuit Breaker, garantindo que seus sistemas permaneçam resilientes diante de falhas.
Um Circuit Breaker é um padrão de design que ajuda a gerenciar falhas de forma elegante.
Assim como um disjuntor elétrico evita danos interrompendo o fluxo de energia quando ocorre uma sobrecarga, um circuit breaker de software interrompe temporariamente as solicitações a um serviço quando detecta falhas repetidas.
Para as empresas, essa abordagem é inestimável. Ao prevenir falhas em cascata, o Circuit Breaker dá aos sistemas o tempo necessário para se recuperarem sem sobrecarregar os recursos. Isso resulta em uma experiência do usuário mais estável e reduz o risco de perda de receita devido a períodos de inatividade.
Um Circuit Breaker monitora as taxas de sucesso e falha das solicitações a um serviço e alterna entre três estados:
Circuito fechado (closed): Todas as solicitações passam, assumindo que o serviço está saudável.
Circuito aberto (open): As solicitações são bloqueadas após as falhas excederem um * predefinido, evitando mais pressão sobre o serviço com falha.
Circuito semiaberto (half-open): Um número limitado de solicitações de teste é permitido para verificar se o serviço se recuperou.
Ao usar um Circuit Breaker, você pode:
Evitar a sobrecarga de serviços com falha, interrompendo solicitações desnecessárias.
Fornecer respostas de * para minimizar o impacto no usuário.
Dar ao serviço com falha um tempo para se recuperar antes de tentar reconectar.
Abaixo estão cenários onde os circuit breakers melhoram significativamente a confiabilidade do sistema:
Em um sistema de reserva de voos, o Serviço de Reserva depende do Serviço de Informações de Voos para obter dados de voos disponíveis. Se o Serviço de Informações de Voos ficar inativo ou tiver tempos de resposta lentos, o Serviço de Reserva pode se tornar não-responsivo.
O Serviço de Reserva envia solicitações ao Serviço de Informações de Voos.
Se o serviço falhar repetidamente, o Circuit Breaker abre, impedindo novas solicitações ao serviço com falha.
O Serviço de Reserva retorna uma resposta de fallback ou informa ao usuário que o serviço está indisponível.
Uma plataforma de e-commerce depende de vários microsserviços. Se o Serviço de Pagamento estiver com problemas, o Serviço de Pedidos pode usar um circuit breaker para evitar que novas solicitações de pagamento sejam enviadas até que o serviço se recupere.
O Serviço de Pedidos envia solicitações de pagamento ao Serviço de Pagamento.
Se o Serviço de Pagamento encontrar falhas, o Circuit Breaker abre, e o Serviço de Pedidos responde com uma mensagem de erro temporária ou usa um método de fallback para concluir o pedido.
Imagine um pipeline projetado para se integrar a serviços externos, como uma API de Serviço de Endereços, para validar endereços com base no código postal inserido durante o registro do usuário. O pipeline deve atender aos seguintes requisitos:
Buscar detalhes completos do endereço via serviço externo.
Usar um Circuit Breaker para lidar com falhas do servidor, evitando tentativas excessivas.
Para este caso de uso, o foco será na implementação do Circuit Breaker, e não no pipeline em si.
1. Configuração do pipeline
Configure um trigger REST com o método POST para receber dados do usuário (código postal).
2. Armazenamento do código postal
Salve os dados na memória de execução (Session Management) e recupere-os antes de chamar a API de Endereços.
3. Verificação do status do Circuit Breaker
A próxima etapa consulta o status do Circuit Breaker em um banco de dados temporário (como um Object Store). Especificamente, verifica se o Circuit Breaker está aberto ou fechado.
Se fechado, o fluxo prossegue com as operações normais do pipeline.
Se não fechado (indicando que falhas recentes excederam o limite), ele bloqueia novas solicitações para evitar falhas em cascata.
4. Tratamento de circuito fechado (Block Execution - onProcess)
Se o circuito estiver fechado e uma chamada à API do Serviço de Endereços for feita, a resposta é processada e retornada ao usuário.
Se ocorrer um erro (indisponibilidade do serviço, etc.), o pipeline é direcionado para o subfluxo onException para lidar com a falha.
5. Tratamento de circuito fechado (Block Execution - onException)
A contagem de falhas é rastreada em um Object Store (ou qualquer outro banco de dados temporário).
Se o limite de falhas não for excedido, a contagem de falhas é incrementada em 1.
Se o limite de falhas for excedido (por exemplo, 15 falhas), o Circuit Breaker é acionado, e o status é atualizado para aberto para evitar novas solicitações ao serviço com falha. Assim, na próxima solicitação, o fluxo será redirecionado para o caminho do circuito "aberto", onde o pipeline bloqueará novas tentativas de interação com o serviço de endereço até que o circuito seja fechado novamente.
6. Abertura do Circuit Breaker
Um conector JSON Generator calcula o tempo desde que o circuito foi aberto em relação ao timestamp atual da execução. Se exceder X minutos, o circuito é redefinido para fechado, permitindo novas solicitações.
7. Sucesso ou Falha após tempo decorrido
Se o circuito estiver aberto por mais de X minutos, o circuito é fechado (redefinido) e, durante a próxima execução do pipeline, o Circuit Breaker tentará reabrir enviando uma nova solicitação ao serviço.
Para acessar um exemplo do padrão Circuit Breaker revisado usado neste caso de uso, clique aqui para ser redirecionado ao desafio do Circuit Breaker na Digibee Academy e procure a folha de respostas lá.
O padrão Circuit Breaker é uma consideração importante ao usar uma arquitetura de microsserviços. Essa abordagem ajuda as integrações a manter a disponibilidade e a resiliência.
Explore mais possibilidades em nosso Portal de Documentação, participe do Desafio do Circuit Breaker ou inscreva-se no curso e webinar de Métricas e Monitoramento no Digibee Academy. Além disso, visite nosso Blog para mais casos de uso e insights.
Se tiver feedback sobre este caso de uso ou sugestões para futuros artigos, adoraríamos ouvir sua opinião através do nosso formulário de feedback