
Fala galera, voltando um pouco a falar de resiliência, hoje vamos de Circuit Breaker mais um pattern de Microsserviços.
Sempre que desenhamos um sistema, pensamos em fazê-lo da melhor forma para que ele nunca falhe, mas lembre-se, essa á uma ilusão, mais cedo ou mais tarde ele vai falhar. Não se sinta culpado, quando falamos de sistemas temos muitos fatores externos que podem, e vão gerar complicações.
Por esse motivo, a comunidade tem criado ao longo do tempo diversas abordagens para lidar com as falhas, e o Circuit Breaker é mais uma delas.
Tal como o nome diz, nada mais é que um disjuntor, e possui um funcionamento muito parecido com o que temos em nossas casas, para proteger nossa rede elétrica.
Uma rede elétrica pode ser sobrecarregada com a utilização acima do que ela foi preparada para suportar, e quando isso acontece o disjuntor “desarma”.
E como funciona nos nossos serviços?
Bom de forma simples, o Circuit Breaker opera em seu estado normal “Closed” que significa que tudo está OK, sua aplicação está funcionando normalmente. Caso algo de errado, a latência aumentou de mais, seu banco de dados apresentou problemas, ou o microsserviço está falhando, o Circuit muda seu estado para “Open”, tirando o acesso a esse serviço da jogada, dessa forma sua aplicação sobrevive, mas sem essa função. Após um tempo determinado, o Circuit volta a fazer algumas requisições no serviço, mudando para o estado “Half Open”, caso as coisas estejam normais ele volta ao estado “Closed”, mas caso o erro persista ele volta ao estado “Open”.
Bom, de forma geral o Circuit é montado para tirar de jogo serviços com mau funcionamento, diminuindo a possibilidade de um erro em cascata e indisponibilização de todo um sistema.
Aqui vai um desenho para ilustrar:

Armadilha:
Algumas pessoas caem na armadilha de utilizar Circuit Breaker para implementação de regras de negócio. Não seja uma delas, isso pode e vai trazer uma complexidade gigante para alterações futuras.
Algumas dicas importantes:
1-) Como sempre digo, log, log e mais um pouquinho de log. Ao implementar o Circuit Breaker, é importantíssimo ter um padrão de geração de log para as falhas, você vai precisar entender o que aconteceu para garantir a integridade da sua aplicação. Mas não esqueça de logar o sucesso também, será importante no futuro, acredite.
2-) No texto falo muito da utilização do temporizador para verificar se o serviço quebrado voltou, mas existe a possibilidade de um caminho alternativo de ping apenas para verificar se o serviço está disponível. Eu gosto mais dessa abordagem, mas para isso seu microsserviço deve estar preparado.
3-) Bom, vale lembrar que o Circuit Breaker não serve para grandes coisas caso você não prepare o resto do sistema para trabalhar sem o serviço quebrado, portanto veja bem como você implementou a resiliência nos demais.
4-) Entenda os tipos de exceção, alguns podem ser mais complexos do que outros. E isso pode determinar o tempo de retorno em cada situação de falha.
Essa é uma forma de implementação de Circuit Breaker, porém se olharmos o conceito, podemos aplicá-lo de diversas outras formas. Já utilizou esse conceito? Conhece outra abordagem? Deixe um comentário ao final do post.
Quer ver ainda mais conteúdo? Me siga no insta @natanpf.
Boa Natan. Com a analogia aos sistemas elétricos, ficou ainda mais didático. Me fez lembrar os bons tempos que estudei eletrônica também rsrs
Parabéns, jovem!!!