DEV Community

Cover image for Circuit Breaker no NestJS com @nestjs/resilience
Bruno Mestres
Bruno Mestres

Posted on

Circuit Breaker no NestJS com @nestjs/resilience

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);
}
Enter fullscreen mode Exit fullscreen mode

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)