서킷 브레이커(CircuitBreaker)의 필요성과 동작 원리

su_under·2024년 5월 21일
0
post-custom-banner

1. CircuitBreaker가 필요한 이유?

개발을 하다 보면 외부 API를 호출해야 하는 경우가 있다. 특히나 전체적인 시스템 구성이 MSA(Microservice Architecture)로 되어 있다면 다른 서비스를 호출하는 경우가 매우 빈번하다. 문제는 서버들에 장애가 발생할 수 있다는 점인데, 호출한 다른 서비스에 장애가 발생했다면 장애가 전파되어, 해당 서비스까지 문제가 발생할 수 있다. 또한 장애가 발생한 서버에 계속 요청을 보내는 것은 장애 복구를 힘들게 만든다.

이를 해결하기 위해서는 장애가 발생한 서비스를 탐지하고, 요청을 보내지 않도록 차단할 필요가 있다. 이때 사용되는 것이 서킷 브레이커이다.


2. CircuitBreaker란?

  • 서킷 브레이커는 해석 그대로 누전 차단기라는 뜻을 지닌다. 누전 차단기는 전기 회로에서 과부하가 걸리거나 단락으로 인한 피해를 막기 위해 자동으로 회로를 정지시키는 장치이다.
  • 서버에서 사용하는 서킷 브레이커도 외부 API 통신의 장애 전파를 막기 위해 장애를 탐지하면 외부와의 통신을 차단하는 역할을 한다.
  • 서킷 브레이커가 실행(오픈)되면 fail-fast 함으로써 외부 서비스가 장애가 나더라도 빠르게 에러를 응답 받을 수 있는 장점이 있으며 개발자가 지정한 행위를 리턴 받을 수 있다.

3. CircuitBreaker 동작 원리

서킷 브레이커의 3가지 상태

실제 회로를 기준으로 전구가 외부 API 또는 Callee에 해당하고, Power Source가 클라이언트(다른 서버를 호출하는 서버) 또는 Caller에 해당한다. 그리고 회로 차단기에는 크게 CLOSED, OPEN, HALF_OPEN 3가지 상태가 존재하는데, 각각의 상태를 정리하면 다음과 같다.

  • CLOSED: circuit이 닫힌 상태로, 외부 호출이 정상상태이다.
  • OPEN: circuit이 열린 상태로, 오류(실패호출/느린호출)가 발생했을 때 OPEN 상태로 전환된다.
  • HALF_OPEN: OPEN 상태가 발생한 이후 일정 시간이 지난 상태이다. 이때 상태가 정상적이라면 CLOSED로, 아니라면 다시 OPEN으로 전환된다.

CircuitBreaker의 동작 방식

  1. 일반적으로 외부 서버는 정상적으로 실행 중이며, 서킷 브레이커는 닫혀 있어 모든 요청이 정상적으로 전달되고 응답을 받는다.

  2. 외부 서버에 장애가 발생하여 요청이 실패하기 시작한다.

  3. 요청 실패가 계속되면, 설정된 실패율 임계값을 초과하게 되고 서킷 브레이커가 열려(OPEN 상태) 모든 요청이 즉시 실패한다.

  4. 서킷 브레이커가 열린 상태에서는 이후의 모든 요청이 외부 서버로 전달되지 않고 즉시 에러 또는 실패 응답을 반환한다. 이로써 외부 서버에 추가적인 부하를 방지한다.

  5. 외부 서버가 정상적으로 복구된다.

  6. 서킷 브레이커가 OPEN 상태로 전환된 후 설정된 시간이 지나면 HALF_OPEN 상태로 변경된다. 이 상태에서는 일부 요청만 외부 서버로 전달하여 서버가 정상적으로 동작하는지 테스트한다.

  7. HALF_OPEN 상태에서 일부 요청이 성공하면, 서킷 브레이커는 다시 닫혀(CLOSED 상태) 모든 요청이 정상적으로 전달된다. 만약 요청이 실패하면 다시 OPEN 상태로 전환된다.

  8. 외부 서버가 정상적으로 응답하기 시작하면, 서킷 브레이커는 CLOSED 상태로 전환되어 모든 요청이 정상적으로 전달된다.


🔗 참고 자료


👉 관련 포스팅

2. 서킷 브레이커(CircuitBreaker) 적용하기

profile
솨의 개발일기
post-custom-banner

0개의 댓글