원격 리소스 요청은 느린 네트워크 연결이나 시간 초과, 혹은 일시적인 문제로 실패할 수 있다. 이런 경우 재시도를 통해 해결 할 수 있으나, 원격 요청의 연속적인 실패와 함께 오류의 복구가 더 오래 걸린다면 재시도는 오히려 시스템의 메모리, 스레드, 데이터베이스 커넥션과 같은 자원을 점유하면서 더 큰 문제를 발생 시킬 수 있다.
Circuit Breaker 패턴은 이러한 반복적인 오류를 막기위한 방법이다. 요청 처리에 일종의 프록시로 동작하는데, 최근 발생한 실패 회수를 기록하고 이를 토대로 요청을 정상적으로 처리할지 아니면 곧바로 막을지 결정한다.
Circuit Breaker는 세 가자 상태 Closed, Open, Half Open로 구현된다.
- Closed: 비활성화 상태. 최근 실패 회수를 기록하고 임계값을 초과하면 Open 상태로 바뀌게 된다. Closed인 경우 요청은 처리Operate된다.
- Open: 활성화 상태. 요청을 처리하지 않고 즉시 예외를 반환한다. 일정 시간동안 상태가 지속되고 시간이 끝나면 Half Open 상태가 된다.
- Half Open: 일부 요청에 한에서 처리되도록 허용하는데 이때 허용한 요청이 하나라도 실패하면 다시 Open으로 돌아가고 모든 요청이 성공하면 시스템이 복구된 것으로 간주, Closed가 되며 모든 요청이 처리된다.
요청의 처리가 실패할 가능성이 매우 높을 때, 애플리케이션이 원격 서비스나 공유 자원에 접근하지 못하도록 막기 위해 이 패턴을 사용한다. 비즈니스 로직의 예외를 처리하기 위해 사용되어서는 안된다.
언어, 프레임워크에 구현체가 있는데 요청 상태 코드 혹은 예외 클래스 조건 등 적용하려는 시스템 내에서 커스터마이징을 위해 직접 구현하는 것도 좋다.