O documento descreve o padrão Circuit Breaker, que previne que uma aplicação tente repetidamente executar uma operação que provavelmente irá falhar. O Circuit Breaker age como um proxy monitorando falhas recentes e decidindo se permite ou não uma operação baseado no número de falhas. Ele muda entre três estados - Closed, Open e Half-Open - para controlar o acesso a serviços externos e garantir a resiliência da aplicação. O padrão deve ser usado quando se precisa impedir tentativas de invocar serviços remotos que provavelmente falharão
3. Introdução
• Quando desenvolvemos aplicações, geralmente precisamos realizar chamadas a
serviços e aplicações externas
Ex.: Um sistema de compra de eletrodomésticos que realiza chamadas a serviços de
pagamento e anti-fraude, validando se os dados do cliente são válidos
• Sempre que realizamos chamadas a serviços externos, existe a possibilidade de ocorrer
problemas na rede ou então que o serviço esteja com falhas.
• Sendo assim, se o serviço externo está com falhas, realizar novas tentativas de acesso
ao serviço não irá ajuda-lo a serem recuperados.
• Se soubermos que o problema está com o serviço de fato, pode-se implementar o
padrão Circuit Breaker na aplicação do cliente
5. Padrão Circuit Breaker
• Escrito por Michael T. Nygard no
livro Design and Deploy
Production-Ready Software
(2007).
• Previne que a aplicação tente
repetidamente executar uma
operação que provavelmente irá
falhar.
• O padrão também permite que
uma aplicação detecte se a falha
foi resolvida.
6. Padrão Circuit Breaker
• Circuit Breaker age como um proxy para operações que podem falhar.
• O proxy deve monitorar o número de falhas recentes que ocorreram e usar esta
informação para decidir quando permitir que a operação continue, ou
simplesmente retornar uma exceção.
• O proxy pode ser implementado como uma máquina de estados, que simulam
um circuito (Circuit Breaker).
8. Estado 1: Closed
• O proxy mantém a quantidade de falhas recentes, e se
uma chamada a operação ocorre novamente, o proxy
incrementa um contador de falhas.
• Caso a operação ocorra com sucesso, o resultado é
retornado com sucesso.
• Se o número de falhas excedem a quantidade ao
threshold em um certo período, o proxy é
redirecionado para o estado Open.
• Um timer referente a timeout é iniciado neste estado.
Quando este timer expira, o proxy é redirecionado para
o estado Half-Open.
9. Estado 1I: Open
• Uma requisição da aplicação falha imediatamente e
uma exceção é retornada para a aplicação.
• Se o Timer expira, é redirecionado para o estado Half-
Open.
10. Estado III: Half-Open
• Estado invocado apenas se um determinado número de
requisições da aplicação foi atingido.
• Se as requisições ocorreram com sucesso, assume-se
que a falha anterior foi fixada e que então o Circuit
Breaker poderá ir para o estado Closed (e o contador é
reiniciado).
• Se as requisições falham, o Circuit Breaker assume que
a falha continua presente e o estado é alterado para
Open, reiniciando o Timer de timeout.
12. Considerações sobre o padrão Circuit Breaker
• Ao implementar o padrão Circuit Breaker, é necessário realizar as seguintes
considerações:
• Tratamento de exceções: O Cirtuit Breaker deve ser capaz de examinar o máximo de
exceções possíveis.
• Logs de erros: Sempre devem ocorrer para que o administrador do sistema possa
verificar o comportamento do mesmo.
• Concorrência: O Circuit Breaker pode ser acessado por um alto número de instâncias
da aplicação simultaneamente. A aplicação não deverá bloquear requisições que sejam
concorrentes.
• Timeouts Inapropriados de Serviços Externos: O Circuit Breaker pode não ser capaz
de proteger aplicações que tenham um timeout específico.
13. Considerações sobre o padrão Circuit Breaker
• O padrão Circuit Breaker deverá ser utilizado quando:
• Deve-se impedir que a aplicação tente invocar um serviço remoto ou acessar um
recurso compartilhado, caso esta operação provavelmente falhe.
• O padrão Circuit Breaker não deverá ser considerado quando:
• Tenta-se manipular recursos privados de uma aplicação, como por exemplo a estrutura
de dados. Neste caso, o Circuit Breaker irá gerar uma sobrecarga no sistema.
• Como um substituto de manipulador de exceções para tratar lógica de negócio nas
aplicações.