개발을 하다 보면 외부 API를 호출해야 하는 경우가 있다. 특히나 전체적인 시스템 구성이 MSA(Microservice Architecture)로 되어 있다면 다른 서비스를 호출하는 경우가 매우 빈번하다. 문제는 서버들에 장애가 발생할 수 있다는 점인데, 호출한 다른 서비스에 장애가 발생했다면 장애가 전파되어, 해당 서비스까지 문제가 발생할 수 있다. 또한 장애가 발생한 서버에 계속 요청을 보내는 것은 장애 복구를 힘들게 만든다.
이를 해결하기 위해서는 장애가 발생한 서비스를 탐지하고, 요청을 보내지 않도록 차단할 필요가 있다. 이때 사용되는 것이 서킷 브레이커이다.
실제 회로를 기준으로 전구가 외부 API 또는 Callee에 해당하고, Power Source가 클라이언트(다른 서버를 호출하는 서버) 또는 Caller에 해당한다. 그리고 회로 차단기에는 크게 CLOSED, OPEN, HALF_OPEN 3가지 상태가 존재하는데, 각각의 상태를 정리하면 다음과 같다.
일반적으로 외부 서버는 정상적으로 실행 중이며, 서킷 브레이커는 닫혀 있어 모든 요청이 정상적으로 전달되고 응답을 받는다.
외부 서버에 장애가 발생하여 요청이 실패하기 시작한다.
요청 실패가 계속되면, 설정된 실패율 임계값을 초과하게 되고 서킷 브레이커가 열려(OPEN 상태) 모든 요청이 즉시 실패한다.
서킷 브레이커가 열린 상태에서는 이후의 모든 요청이 외부 서버로 전달되지 않고 즉시 에러 또는 실패 응답을 반환한다. 이로써 외부 서버에 추가적인 부하를 방지한다.
외부 서버가 정상적으로 복구된다.
서킷 브레이커가 OPEN 상태로 전환된 후 설정된 시간이 지나면 HALF_OPEN 상태로 변경된다. 이 상태에서는 일부 요청만 외부 서버로 전달하여 서버가 정상적으로 동작하는지 테스트한다.
HALF_OPEN 상태에서 일부 요청이 성공하면, 서킷 브레이커는 다시 닫혀(CLOSED 상태) 모든 요청이 정상적으로 전달된다. 만약 요청이 실패하면 다시 OPEN 상태로 전환된다.
외부 서버가 정상적으로 응답하기 시작하면, 서킷 브레이커는 CLOSED 상태로 전환되어 모든 요청이 정상적으로 전달된다.