DEV Community

Francisco Zanfranceschi
Francisco Zanfranceschi

Posted on • Updated on

[Desafio] - Circuit Breaker

Conteúdo original nessa thread to twitter.


Ei dev, você quer impressionar seu crush no próximo date sem ficar falando só de CRUD? Claro, né?!

Então aceite esse desafio técnico pra aprender NA PRÁTICA o que é e como funciona um CIRCUIT BREAKER!

🧵👇

Date Sucesso com Circuit Breaker


Circuit Breaker é um padrão usado pra proteger um recurso (API, serviço, qualquer componente) que não esteja funcionando bem.

Uma boa referência pra entender melhor tá aqui: https://martinfowler.com/bliki/CircuitBreaker.html

Vou me basear nesse post aí do Martin Fowler pro desafio.

Circuit Breaker


Desafio:

Crie duas APIs que funcionem mais ou menos como esse desenho. Sério, faça do seu jeito – fica mais legal!

Desafio


Para a API 02: Faça com que ela falhe algumas vezes consecutivamente. Por exemplo:

falhar = (agora.segundos  >= 0 and agora.segundos <= 15)

if (falhar)
  retorna erro;
Enter fullscreen mode Exit fullscreen mode

Aí ela vai falhar por 15 segundos consecutivos a cada minuto.


Agora o bicho pega! Para a API 01: Implemente o circuit breaker. Você precisa definir um limiar (fala "threshold" pra impressionar o crush, tá?). Por exemplo "se falhar 5x consecutivas, eu abro o circuito (desarmar)". Você terá que usar um contador de erros.


Você também precisa implementar algo que faça com que o circuito seja fechado novamente (volte a funcionar). Você pode usar um temporizador, por exemplo.
Algo como: "ah, já tem 10 segs que esse troço tá desarmado, deixa eu armar novamente e ver se funciona".


É fundamental definir na API 01 como a indisponibilidade será informada.

É um erro HTTP 4XX, um 5XX, um 2XX!?

Tem que terminar o date com essa treta resolvida, tá?


Circuit Breaker não é só pra quando tem erro no recurso protegido, tá? É comum desarmar o circuito quando o tempo de resposta começa a ficar alto também, por exemplo.


A thread original foi inspirada nesse post aqui da @Estefanadie

Discussion (0)