본문 바로가기
WIKI 기술 지식 베이스

Traefik Circuit Breaker 미들웨어

원문 보기 위키 갱신

출처: Traefik Circuit Breaker 미들웨어 (CircuitBreaker Documentation)

본문

Circuit Breaker

HTTP 서킷 브레이커는 불건전한(unhealthy) Service로 요청이 쌓여 연쇄 장애(cascading failures)가 발생하는 것을 막아줘요.

시스템이 건강할 때는 회로가 닫혀 있어요 (정상 동작). 시스템이 불건전해지면 회로가 열리고 요청은 더 이상 전달되지 않으며, 대신 폴백(fallback) 메커니즘이 이를 처리해요.

시스템이 건강한지 판단하기 위해 서킷 브레이커는 서비스들을 지속적으로 모니터링해요.

서킷 브레이커는 미들웨어 체인 내에서 자기 위치 이후에 일어나는 일만 분석해요. 그 이전의 일은 상태에 아무 영향도 주지 않아요.

각 라우터는 주어진 서킷 브레이커의 자신만의 인스턴스를 갖게 돼요. 하나의 서킷 브레이커 인스턴스가 열려 있어도 다른 인스턴스는 닫혀 있을 수 있어요. 그들의 상태는 공유되지 않아요.

이것이 기대되는 동작이에요. 라우트마다 서킷 브레이커를 선언할 필요 없이, 어떤 것이 서비스를 건강하게 만드는지 정의할 수 있게 하려는 거예요.

설정 예시

구조화 (YAML)

# 지연 시간 검사
http:
  middlewares:
    latency-check:
      circuitBreaker:
        expression: "LatencyAtQuantileMS(50.0) > 100"

구조화 (TOML)

# 지연 시간 검사
[http.middlewares]
  [http.middlewares.latency-check.circuitBreaker]
    expression = "LatencyAtQuantileMS(50.0) > 100"

Labels

# 지연 시간 검사
labels:
  - "traefik.http.middlewares.latency-check.circuitbreaker.expression=LatencyAtQuantileMS(50.0) > 100"

Tags

{
  //..
  "Tags" : [
    "traefik.http.middlewares.latency-check.circuitbreaker.expression=LatencyAtQuantileMS(50.0) > 100"
  ]
}

Kubernetes

# 지연 시간 검사
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
  name: latency-check
spec:
  circuitBreaker:
    expression: LatencyAtQuantileMS(50.0) > 100

설정 옵션

| 필드 | 설명 | 기본값 | 필수 | | expression | 서킷 브레이커를 열고 서비스를 호출하는 대신 폴백 메커니즘을 적용할 조건이에요. 자세한 내용은 여기 | "" | 아니요 | | checkPeriod | 서킷 브레이커 조건(대기 상태일 때)을 연속해서 검사하는 간격이에요. | 100ms | 아니요 | | fallbackDuration | 서킷 브레이커가 복구를 시도하기 전에 기다리는 시간(트립된 상태에서)이에요. | 10s | 아니요 | | recoveryDuration | 서킷 브레이커가 복구를 시도하는 시간(복구 상태에 들어가자마자)이에요. | 10s | 아니요 | | responseCode | 서킷 브레이커가 열린(open) 상태일 때 반환할 상태 코드예요. | 503 | 아니요 |

expression

expression 옵션은 세 가지 서로 다른 지표(metric)를 검사할 수 있어요:

| 지표 | 설명 | 예시 | | NetworkErrorRatio | 서킷 브레이커를 여는 네트워크 오류 비율이에요. | NetworkErrorRatio() > 0.30 은 네트워크 오류 비율이 30%일 때 서킷 브레이커를 열어요 | | ResponseCodeRatio | 서킷 브레이커를 여는 상태 코드 비율이에요. 자세한 내용은 아래 | ResponseCodeRatio(500, 600, 0, 600) > 0.25 는 요청의 25%가 5XX 상태를 반환하면(0에서 5XX 사이의 상태 코드를 반환한 요청 중) 서킷 브레이커를 열어요 | | LatencyAtQuantileMS | 주어진 비율의 요청이 너무 느려질 때 서킷 브레이커를 여는, 밀리초 단위 분위수(quantile)의 지연 시간이에요. 분위수 값에는 부동소수점 숫자(끝에 .0 포함)만 사용해요. | LatencyAtQuantileMS(50.0) > 100 은 중앙값 지연 시간(분위수 50)이 100ms에 도달하면 서킷 브레이커를 열어요. |

ResponseCodeRatio

  • 네 개의 파라미터, from, to, dividedByFrom, dividedByTo를 받아요.

  • 계산되는 연산은 sum(to -> from) / sum(dividedByFrom -> dividedByTo)예요. 만약 sum(dividedByFrom -> dividedByTo)가 0이면 ResponseCodeRatio는 0을 반환해요.

  • from은 포함(inclusive)이고, to는 제외(exclusive)예요.

여러 지표 사용하기

expression에서 연산자를 사용해 여러 지표를 결합할 수 있어요.

지원되는 연산자는 다음과 같아요:

  • AND (&&)

  • OR (||)

예를 들어, ResponseCodeRatio(500, 600, 0, 600) > 0.30 || NetworkErrorRatio() > 0.10 은 요청의 30%가 5XX 상태 코드를 반환하거나, 네트워크 오류 비율이 10%에 도달하면 서킷 브레이커를 트리거해요.

연산자

지원되는 연산자 목록은 다음과 같아요:

  • Greater than (>)

  • Greater or equal than (>=)

  • Lesser than (<)

  • Lesser or equal than (<=)

  • Equal (==)

  • Not Equal (!=)

폴백 메커니즘

기본적으로 폴백 메커니즘은 대상 서비스를 호출하는 대신 클라이언트에게 HTTP 503 Service Unavailable을 반환해요. 응답 코드는 설정할 수 있어요.

상태

서킷 브레이커에는 세 가지 가능한 상태가 있어요:

  • 닫힘(Closed) (서비스가 정상적으로 동작해요).

  • 열림(Open) (폴백 메커니즘이 서비스를 대신해요).

  • 복구 중(Recovering) (서킷 브레이커가 점진적으로 서비스에 요청을 보내며 정상 동작을 재개하려 해요).

닫힘(Closed)

회로가 닫혀 있는 동안 서킷 브레이커는 요청의 동작을 분석하기 위한 지표만 수집해요.

지정된 간격(checkPeriod)마다 서킷 브레이커는 expression을 평가해 상태를 바꿔야 할지 결정해요.

열림(Open)

열린 동안 폴백 메커니즘은 FallbackDuration 동안 정상 서비스 호출을 대신해요. 폴백 메커니즘은 클라이언트에게 HTTP 503(또는 ResponseCode)을 반환해요. 이 시간이 지나면 복구 중(recovering) 상태로 들어가요.

복구 중(Recovering)

복구 중인 동안 서킷 브레이커는 서비스에 선형적으로 증가하는 양의 요청을 보내요 (RecoveryDuration 동안). 만약 복구 중에 서비스가 실패하면 서킷 브레이커는 다시 열려요. 복구 시간 동안 서비스가 정상적으로 동작하면, 서킷 브레이커는 닫혀요.

더 알아보기 (Learn more)