목차
1. CircuitBreaker란?
- 말 그대로 누전 차단기
- 누전 차단기는 전기 회로에서 과부하가 걸리거나 단락으로 인한 피해를 막기 위해 자동으로 회로를 정지시키는 장치
- 서버에서 외부 API 통신의 장애 전파를 막기 위해 장애를 탐지하면 외부와의 통신을 차단하는 역할
- Circuit Breaker가 실행(open)되면 Fail Fast함으로써 외부 서비스에 장애가 나더라도 빠르게 에러를 응답 받고 개발자가 지정한 행위를 리턴받을 수 있다.
*fail-fast: 오류가 발생하면 곧바로 오류를 알리고 작업을 중단 - 장점
- 연동 서버의 장애로 인해 slow call 발생 시 전체 서버로의 장애 전파 방지
- 연동 서버 장애 발생 시 call을 차단하여 연동 서버의 장애가 과중되지 않도록 한다.
=> 장애 발생된 서버에 계속해서 call이 유입되면 장애시간이 늘어나고 상황이 더 악화될 수 있다. circuitbreaker 적용을 통해 장애 발생시 더이상의 call이 유입되지 않아 장애를 복구할 수 있는 기회가 생긴다. - 연동 서버의 장애가 복구된 경우 이를 감지하여 자동으로 정상화
- 대시보드 적용으로 전체 연동 서버 현황 파악 가능
2. CircuitBreaker 구조
- 서버A(caller)와 서버B(callee) 사이에 circuit breaker 위치
- 서버A가 서버B를 호출할 때 circuit breaker가 모든 트래픽을 bypass 한다.
- 이때 서버B에 응답이 없으면 circuit breaker가 서버B로의 호출을 강제로 끊고 서버A에 에러 메시지 또는 다른 의미있는 메시지(fall-back 메시지)를 보낸다.
3. CircuitBreaker 패턴
- circuit breaker는 3개의 status로 관리된다.
- callee 서버에 장애 발생 시 이를 감지하여 더 이상의 call이 발생하지 않도록 차단 → Open 상태
- open 상태에서 일정 시간 후 callee 서버의 장애 복구를 감지하기 위해 Half Open 상태로 자동 전환 → Half Open 상태
- Half Open 상태에서 일부 call을 허용하여 callee 서버의 장애 복구를 감지하여 call 차단 해제 → Closed 상태
- 장애 상황인 경우 다시 Open 상태로 전환
- callee 서버의 장애 여부는 아래 두 값으로 판단, 설정된 임계치를 넘어가면 call이 차단된다.
- slow call: 기준 시간보다 오래 걸린 call
- failure call: callee 서버로의 요청이 실패하거나 callee에서 서버 오류를 응답한 경우
4. CircuitBreaker 방식 및 설정
CircuitBreaker는 sliding window를 이용해서 호출 결과를 집계하고 저장한다. circuit breaker 방식은 count-based sliding window 방식과 time-based sliding window 방식을 선택할 수 있다.
count-based sliding window 방식은 마지막 N번의 호출 결과를 집계한다. time-based sliding window 방식은 마지막 N초의 호출 결과를 집계한다.
4.1 Count-based sliding window
사용자가 설정한 호출 횟수와 실패율을 기반으로 CircuitBreaker의 상태를 변경한다.
예시)
config propertydefault valuedescription
slidingWindowType | COUNT_BASED | CircuitBreaker가 닫힌 상태에서 호출 겨로가를 기록할 대 쓸 슬라이딩 윈도우 타입을 설정한다. 슬리이딩 윈도우 타입은 카운트 기반과 시간 기반이있다. COUNT_BASED인 경우: slidingWindowSize 횟수만큼의 호출을 기록하고 집계한다. TIME_BASED인 경우: 마지막 slidingWindowSize초 동안의 호출을 기록하고 집계한다. |
slidingWindowSize | 100 | CircuitBreaker가 closed인 상태에서(정상상태) 호출 결과를 기록할 때 쓸 슬라이딩 윈도우의 크기를 설정한다. |
minimumNumberCalls | 100 | CircuitBreaker가 실패 비율이나 slow call 비율을 계산할 때 필요한 최소 호출 수를 설정한다. 예) minimumNumberCalls = 10 이면 최소 호출을 10번 기록해야 실패 비율을 계산할 수 있다. 호출 횟수가 9번 뿐이라면 9번 모두 호출실패해도 CircuitBreaker는 open 되지 않는다. |
failureRateThreshold | 50 | 실패 비율 임계치를 백분율로 설정. 실패 비율이 임계치보다 크거나 같으면 CircuitBreaker는 open 상태로 전환되며 이때부터 호출을 끊는다. |
slidingWindowType = COUNT_BASED, slidingWindowSize = 10, minimumNumberCalls = 6, failureRateThreshold = 50
위 속성값의 의미는 실패율을 계산하기 위한 최소 횟수는 6회이다. (minimumNumberCalls = 6)
만약 5번 호출되는 경우 최초 상태인 Closed 상태에서 변경되지 않은 상태이고, 6번째 호출되었을 때 6번 호출 횟수 중에 실패가 4번인 경우 4/6실패 확률을 약67%가 된다.
실패 확률은 failureRateThreshold가 50%이므로 이 값을 넘었기 때문에 Open 상태로 변경될 것이다.
여기서 주의할 점은 minimumNumberCalls가 slidingWindowSize보다 큰 경우 slidingWindowSize 설정값으로 호출 횟수가 정의된다.
4.2 Time-based sliding window
사용자가 설정한 N초와 실패율을 기반으로 CircuitBreaker의 상태를 변경한다.
예시)
slidingWindowType = TIME_BASED, slidingWindowSize = 10, minimumNumberCalls = 6, failureRateThreshold = 50
slidingWindowSize는 10초를 의미한다.
10초동안 6번 호출되었을 때 실패율을 계산하여 설정한 실패율 보다 높은 경우 상태값을 변경한다.
만약 10초 동안 5번 호출되었는데 그 이후로 10초 지나고나서 호출하는 경우, 값이 reset되어서 다시 계산한다.
참고: https://resilience4j.readme.io/docs/circuitbreaker
5. 참고
https://engineering.linecorp.com/ko/blog/circuit-breakers-for-distributed-services/
https://velog.io/@vies00/Circuit-Breaker-Pattern
'스터디 > Spring' 카테고리의 다른 글
[Springboot] CircuitBreaker 적용방법(2) - 코드 적용 (0) | 2023.08.18 |
---|---|
[Springboot] CircuitBreaker 적용방법 (1) - Resilience4j (0) | 2023.08.18 |
[Springboot] @Scheduled cron 사용하는 방법 (0) | 2023.08.12 |
[Spring] Spring 프로젝트에서 리소스 파일 읽기 (Java8) (0) | 2023.08.11 |
[Spring] 스프링 @MockBean, @SpyBean (0) | 2023.03.12 |
댓글