Pular para o conteúdo

apps/resiliency/circuit-breaker

103 · Resiliência & Tolerância a Falhas · ≈ 6 min de estudo

Circuit Breaker

Protege a chamada a uma dependência instável com uma máquina de estados: depois de N falhas de infraestrutura seguidas o circuito abre e rejeita na hora (fast-fail), sem tentar; passado o tempo de abertura, uma única sonda decide se fecha ou reabre. Evita que um serviço caído esgote conexões e propague a falha em cascata.

passos
6
arquivos
5
testes
0
tecnologias
4
Lógica puraTypeScriptBunElysiaStryker
Baixar cartão

Cenário

Todo PIX passa pelo antifraude antes de liquidar. Quando o antifraude cai (503) ou trava sem responder, o breaker abre após três falhas e os PIX seguintes falham em 0 ms, em vez de segurar conexões esperando. Um PIX acima do limite recebe 422 do antifraude: é uma resposta de negócio, prova que o serviço está de pé, e não conta como falha.

Planta

Estados
6/6
chamada antes doopenTimeoutMs, fast-failCLOSEDOPENHALF_OPEN3 falhas seguidas(5xx, timeout,conexão recusada)primeira chamadaapós openTimeoutMssonda aprovadasonda falha
6

6 passos — reproduza para seguir o fluxo

  • chamada
  • resposta ou assíncrono
  • falha
  • passo
  • toque num nó para focar
  • repouso ou sucesso
  • transição
  • falha ou recusa
  • Outras plantas de estados

Como funciona

6 passos

Fechado, aberto, meio-aberto.

Esconde cada passo: lembre antes de tocar para revelar.

Vocabulário compartilhado

AbortSignal+3
TimeoutError+1
ErrorCircuitOpen+1
openTimeoutMs+1
HALF_OPEN+1
  1. 01

    CircuitBreaker.execute passa à operação um AbortSignal de callTimeoutMs: serviço travado vira TimeoutError, e não uma espera infinita

  2. 02

    isFailure decide o que conta — no cliente, só 503, timeout e conexão recusada; ErrorAntifraudRejected (4xx) zera a sequência como um sucesso

  3. 03

    Em CLOSED, a falha número failureThreshold seguida abre o circuito e grava openedAt

  4. 04

    Em OPEN, toda chamada lança ErrorCircuitOpen sem tocar o antifraude até openTimeoutMs

  5. 05

    Em HALF_OPEN passa uma sonda só; as concorrentes falham rápido; sucesso fecha, falha reabre e reinicia a espera

  6. 06

    Cada transição sai numa linha de log estruturado (circuit.transition, de, para, contagem)

Trade-offs

O que se ganha, o que se paga

3 vantagenscada ganho tem um preço3 custos

Vantagens

  • Serviço caído não esgota conexões nem propaga a falha

  • Fast-fail dá resposta imediata para acionar fallback

  • Sonda única testa a recuperação sem avalanche de chamadas

Custos

  • Chamadas válidas são rejeitadas enquanto o circuito está aberto

  • failureThreshold e openTimeoutMs precisam do tráfego real para calibrar

  • Contagem consecutiva não serve para alto tráfego — lá, taxa em janela deslizante

apps/resiliency/circuit-breaker

5 arquivos

src/

  • breaker_circuit.tsMáquina de estados, timeout da chamada, sonda única e log de transição
  • client_antifraud.tsCliente do antifraude com seu breaker e a classificação de falha
  • antifraud_service.tsAntifraude em ElysiaJS com saúde trocada em runtime (saudável, fora, travado)
  • config_circuit.tsConfiguração validada do ambiente
  • demo.tsdemoFluxo PIX: saudável, queda, recuperação por sonda e travamento

Executar · só Bun

  1. bun install# dependências
  2. bun run demo# roda o cenário
  3. bun run test# testes unitários
  4. bun run test:mutation# mutação com Stryker
Requisitos
Bun
Esc

↑ ↓ navegarEnter abrir191 resultados