Circuit breaker
Em sistemas distribuídos, uma chamada a um serviço externo pode falhar repetidamente. Sem um circuito de proteção, você corre o risco de sobrecarregar o recurso já instável com tentativas inúteis, piorando a situação. O padrão Circuit Breaker resolve isso: após um número definido de falhas consecutivas, ele "abre" o circuito e recusa imediatamente novas chamadas por um período, dando tempo para o serviço se recuperar. Dominar esse padrão é essencial para construir sistemas resilientes.
O PROBLEMA
Implemente Circuit Breaker: após N falhas, abre por X segundos.
EXEMPLO
const cb = criarCircuitBreaker(servico, {maxFalhas:3, timeoutMs:5000});
// após 3 falhas → 'Circuito aberto'SOBRE O CONCEITO
O Circuit Breaker tem três estados: fechado (chamadas normais), aberto (chamadas recusadas) e semiaberto (tentativa de reabertura). Para implementá-lo sem loops, você usa uma estrutura de objeto para armazenar o contador de falhas (let falhas) e o timestamp da abertura (let abertoEm). Ao chamar a função, verifique primeiro se o circuito está aberto: se Date.now() - abertoEm for menor que o timeout, rejeite imediatamente com throw 'Circuito aberto'. Caso contrário, mova para semiaberto e tente executar o serviço. Se a chamada for bem-sucedida, reset o contador e feche o circuito; se falhar, incremente o contador e, se atingir maxFalhas, registre abertoEm = Date.now() e lance erro. O erro comum de não rastrear o tempo de abertura impede que o circuito saia do estado aberto, pois a condição de tempo nunca será satisfeita.
RESOLUÇÃO