Quando trabalhamos com APIs, é comum depender de serviços externos para executar determinadas operações.
Imagine uma aplicação de e-commerce que precisa se comunicar com uma transportadora para solicitar o envio de um pedido.
Mas o que acontece se a API da transportadora começar a apresentar falhas?
Uma alternativa para lidar com esse cenário é utilizar o Circuit Breaker, um padrão de resiliência que permite interromper temporariamente chamadas a um serviço quando ele apresenta falhas recorrentes.
No NestJS, podemos implementar esse comportamento de maneira declarativa utilizando o decorator @CircuitBreaker do módulo @nestjs/resilience.
Implementando o Circuit Breaker
Vamos considerar um endpoint responsável por solicitar o despacho de uma entrega:
@Post(':id/dispatch')
@CircuitBreaker({
name: 'carrier',
minimumCalls: 2,
failureRateThreshold: 50,
slidingWindow: { type: 'count', size: 2 },
openDuration: '5s',
})
dispatch(@Param('id') id: string) {
return this.shippingService.dispatch(id);
}
Nesse exemplo, aplicamos o Circuit Breaker diretamente ao método responsável por iniciar o despacho.
O decorator recebe algumas configurações que determinam quando o circuito deve ser aberto e por quanto tempo as chamadas serão interrompidas.
Vamos entender cada uma:
-
name: identifica o circuito como
carrier. - minimumCalls: define o mínimo de chamadas necessárias para avaliar a taxa de falhas.
- failureRateThreshold: estabelece a porcentagem de falhas necessária para abrir o circuito. Nesse caso, 50%.
- slidingWindow: define uma janela de avaliação baseada nas últimas 2 chamadas.
- openDuration: determina que o circuito permaneça aberto por 5 segundos antes de permitir uma tentativa de recuperação.
Com essa configuração, se uma das duas chamadas falhar, o circuito poderá ser aberto, pois a taxa de falhas atingiu 50%.
Enquanto estiver aberto, novas chamadas protegidas pelo circuito serão rejeitadas sem executar o método.
Após os 5 segundos, o circuito poderá entrar no estado Half-Open, permitindo verificar se o serviço voltou a funcionar normalmente.
O que ganhamos com essa abordagem?
Uma das principais vantagens é conseguir aplicar uma estratégia de resiliência sem precisar implementar manualmente toda a lógica de controle de falhas.
Também conseguimos manter o código mais organizado, separando a regra de negócio da configuração do Circuit Breaker.
Entretanto, vale lembrar que o Circuit Breaker não resolve a indisponibilidade do serviço externo. Ele apenas evita que continuemos realizando chamadas para uma dependência que apresenta problemas.
Além disso, a configuração utilizada no exemplo é bastante sensível, já que considera apenas duas chamadas. Em produção, os valores devem ser ajustados de acordo com o volume de requisições e o comportamento esperado da aplicação.
Conclusão
O @nestjs/resilience oferece uma maneira prática de adicionar mecanismos de resiliência às aplicações NestJS.
Com poucas configurações, conseguimos proteger operações que dependem de serviços externos e reduzir o impacto de falhas recorrentes.
O mais importante não é simplesmente adicionar um Circuit Breaker, mas entender quando utilizá-lo e como configurar seus limites para evitar que uma proteção acabe prejudicando a disponibilidade da própria aplicação.
Top comments (0)