본문 바로가기
스터디/Spring

[Springboot] CircuitBreaker란 뜻 의미

by zoodi 2023. 8. 17.
728x90

목차

     

     

    1. CircuitBreaker란?

    • 말 그대로 누전 차단기
    • 누전 차단기는 전기 회로에서 과부하가 걸리거나 단락으로 인한 피해를 막기 위해 자동으로 회로를 정지시키는 장치
    • 서버에서 외부 API 통신의 장애 전파를 막기 위해 장애를 탐지하면 외부와의 통신을 차단하는 역할
    • Circuit Breaker가 실행(open)되면 Fail Fast함으로써 외부 서비스에 장애가 나더라도 빠르게 에러를 응답 받고 개발자가 지정한 행위를 리턴받을 수 있다.
      *fail-fast: 오류가 발생하면 곧바로 오류를 알리고 작업을 중단
    • 장점
      • 연동 서버의 장애로 인해 slow call 발생 시 전체 서버로의 장애 전파 방지
      • 연동 서버 장애 발생 시 call을 차단하여 연동 서버의 장애가 과중되지 않도록 한다.
        => 장애 발생된 서버에 계속해서 call이 유입되면 장애시간이 늘어나고 상황이 더 악화될 수 있다. circuitbreaker 적용을 통해 장애 발생시 더이상의 call이 유입되지 않아 장애를 복구할 수 있는 기회가 생긴다.
      • 연동 서버의 장애가 복구된 경우 이를 감지하여 자동으로 정상화
      • 대시보드 적용으로 전체 연동 서버 현황 파악 가능

    2. CircuitBreaker 구조

    (출처: https://qwer9412.tistory.com/2 )

     

     

    • 서버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

    https://martinfowler.com/bliki/CircuitBreaker.html

    Drive Circuit Breaker 패턴

    728x90

    댓글