-
Circuit Breaker #01. 개념개발공부/서버 네트워크 2023. 1. 13. 15:47
서비스 모니터링 중 A서버가 장애난 상황에서 B서버에서 A서버로 호출을 시도하려는데 문제가 생겨 이슈가 발생한 것을 확인했다..
그래서 A서버가 장애난 상황에서 B서버가 통신 시도해보고 실패한 경우 연결을 끊도록 하는 기능 개선을 위해 찾다가
서킷 브레이커가 있다고 하여 우선 공부해보기로 했따,,
(통신..화이팅..)
#0. 개념
백엔드 서버 시스템은 여러 개의 서비스가 네트워크로 연결되어 있는데 만약 이 네트워크 중 하나가 갑자기 전혀 응답하지 않는다면
동작하지 않는 서비스 접속 시 타임아웃 될 때까지 차단되어, 의존성이 있는 서비스까지 연쇄적으로 멈출 가능성이 있음
적어도 가장 중요한 기능에 영향이 가지 않기 위해 이러한 연쇄적인 장애 발생을 막아야함
그러기 위해서는 장애가 발생한 서비스에 대한 접속 차단이 필요
→ 이 시스템을 자동화한 것이 Circuit Breaker
* Circuit Breaker란, 원격 접속의 성공/실패를 카운트하여 에러율(failure rate)이 임계치를 넘어섰을 때 자동적으로 접속을 차단하는 시스템
상태 머신(State Machine)으로 표현 가능
접속 성공과 실패 이벤트가 발생할 때마다 내부 상태를 업데이트하여 자동적으로 장애를 검출하고 복구 여부를 판단
#일반적인 상태
- 일반적인 상태는 요청의 성공 실패 metric을 수집하고 그에 따라 상태가 변함.(상태변이, state transit)
- CLOSED → OPEN으로, OPEN → HALF_OPEN으로, HALF_OPEN은 metric의 실패율에 따라 CLOSED, OPEN 두 상태로 선택하여 상태 변이
CLOSED
초기 상태. 모든 접속은 평소와 같이 실행.
OPEN
에러율이 임계치를 넘어서면 OPEN 상태가 됨. 모든 접속은 차단(fail fast)
HALF_OPEN
OPEN 후 일정 시간이 지나면 HALF_OPEN 상태가 됨. 접속을 시도하여 성공하면 CLOSED, 실패하면 OPEN으로 되돌아감.
#특수상태
- 특수상태를 빠져나오려면 상태전환을 트리거하거나 Circuit Breaker를 리셋하는 방법 뿐임 (강제로 상태 변이)
DISABLED
강제로 CLOSED한 상태 (항상 접근 허용)
실패율에 따른 상태변화도 없고 이벤트를 발행도, 발행하지 않음
FORCED_OPEN
강제로 OPEN한 상태 (항상 접근 거부)
실패율에 따른 상태변화도 없고 이벤트를 발행도, 발행하지 않음
METRICS_ONLY
강제로 CLOSED한 상태 (항상 접근 허용)
실패율에 따른 상태변화는 없지만 이벤트를 발행을 하고 내부 프로세스의 metric 수집함
#슬라이딩 윈도우
- Circuit Breaker는 호출 결과를 저장하고 집계할 때 슬라이딩 윈도우 사용함
카운트 기반 슬라이딩 윈도우 (Count-based sliding window)
- 마지막으로 호출한 N번의 결과를 집계
시간 기반 슬라이딩 윈도우 (Time-based sliding window)
- 마지막 N초 동안의 호출 결과를 집계
#Failure Rate(실패비율) and slow call rate(느린 호출 비율) thresholds
Failure Rate
실패 비율이 설정한 임계치보다 크거나 같을 때 Circuit Breaker의 상태는 CLOSED → OPEN으로 변경 (ex. 50% 이상이 실패로 기록됐을 경우 등)
기본적으로 모든 예외를 실패로 간주
실패로 간주할 예외 리스트 정의해도 됨 → 이런 경우 무시하는 예외만 아니면 그 외 모든 예외를 성공으로 간주
예외는 무시할 수도 있는데, 무시한 예외는 성공/실패 둘 중 무엇으로도 간주하지 않음
slow call rate
느린 호출 비율이 설정한 임계치보다 크거나 같을 때 Circuit Breaker의 상태는 CLOSED → OPEN으로 변경 (ex. 50% 이상이 5초 이상 소요된 것으로 기록됐을 경우 등)
이러한 경우 외부 시스템이 아직 응답을 주지 아닌 것이라도, 미리 부하를 줄일 수 있음
실패 비율과 느린 호출 비율을 계산하려면 먼저 호출 결과를 최소치는 기록한 상태여야함
(ex. 최소한으로 필요한 호출 횟수가 10번으로 지정했을 경우 최소 10번 호출을 기록해야 이후에 실패 비율 계산가능함. 9번밖에 측정하지 않았다면 9번 모두 실패했더라도 Circuit Breaker는 열리지 않음)
Circuit Breaker는 OPEN 상태일 땐 CallNotPermittedException을 던져 호출을 반려함.
대기 시간이 경과하고 나면 OPEN → HALF_OPEN로 상태 변경되며 설정한 횟수만큼 호출을 허용해 백엔드의 이용 가능여부를 확인.
허용한 호출을 모두 완료할 때 까지는 그 이상의 호출은 CallNotPermittedException으로 거부됨.
실패 비율이나 느린 호출 비율이 설정한 임계치보다 크거나 같으면 상태는 다시 OPEN으로 변경됨.
둘 모두 임계치 미만이면 CLOSED 상태로 돌아감
* 참고링크
분산 서비스 환경에 대한 Circuit Breaker 적용 (https://engineering.linecorp.com/ko/blog/circuit-breakers-for-distributed-services/)
Resilience4j CircuitBreaker (https://godekdls.github.io/Resilience4j/circuitbreaker/)
'개발공부 > 서버 네트워크' 카테고리의 다른 글
특정 단어 로그 건수 파악 방벚 (0) 2024.03.22 Circuit Breaker #2. 데모동작 (0) 2023.01.20