회로 차단기 및 분해
CB (Circuit Breaker) 는 고장을 현지화하고 업스트림 서비스 및 사용자를 보호하기 위해 열악한 종속성으로의 통화를 중단하는 보안 패턴입니다. 분해 (우아한 저하) -풀 다운 타임없이 리소스 또는 오류 (예: 캐시/불완전한 데이터 반환, "비싼" 기능 비활성화) 가없는 경우 기능을 의도적으로 단순화합니다.
주요 목표는 계단식 방울 대신 제어 된 장애를 통해 SLO 및 사용자 경험을 유지하는 것입니다.
1) 신청시기
p95/p99 성장, 타임 아웃, 잘못된 답변: 의존성이 불안정합니다.
엄격한 제한/처벌을받는 외부 API.
배상이 폭풍을 강화하는 "무거운" 백엔드 (검색, 권장 사항, 보고서).
수영장 (연결, 실) 이 고갈 될 위험이있는 고부하 지역.
2) CB 상태 및 전환
클래식 트리플:1. 폐쇄-트래픽이 진행되고 오류/대기 시간 지표가 계산됩니다.
2. 열기-통화가 즉시 거부 (실패) 되거나 폴백으로 전송됩니다.
3. Half-Open-제한된 수의 "시험" 요청에 따라 스위치를 닫을 지 여부가 결정됩니다.
오프닝 트리거
창 당 오류/시간 초과 임계 값 (예: 마지막 N의 50% 이상).
대기 시간 임계 값 (예: p95> 대상).
결합 된 정책 (오류가 발생했습니다).
시간 유지 (쿨 다운)
고정 (예: 10-60 초) 또는 적응 (반복 작동으로 지수 증가).
3) 타임 아웃, 퇴각 및 지터
타임 아웃은 항상 업스트림 SLO보다 짧으며 마감일 전파입니다.
dempotent 작업에 대해서만 Retrai; 대부분의 경우 1-2 시도로 충분합니다.
Backoff + jitter (풀 지터) 는 동기식 반복파를 방지합니다.
Hedging (예비 요청) -경제적이고 매우 중요한 읽기에만 해당됩니다.
4) 벌크 헤드 격리 및 "퓨즈"
도메인 및 트래픽 유형 (VIP, 배경 작업, 공개 API) 별도의 연결/작업자/큐 풀입니다.
"비싼" 운영을위한 동시성 한도.
입학 제어: 대기열이 가득 찼을 때 실행하기 쉽습니다.
5) 폴백 및 저하 시나리오
옵션
캐시/스타일 응답: '오래된 재발행', L2/L3 캐시에서 데이터 반환.
읽기 전용: 쓰기/명령 블록, 안전한 읽기 허용.
대리 응답: 불완전한 데이터 (예: 권장 사항/아바타 없음).
기능 비활성화: 중요하지 않은 위젯/기능을 일시적으로 숨깁니다.
기능 플래그: 릴리스없이 빠른 동작 변경.
규칙
폴백은 결정 론적이고 빠르며 데이터로부터 안전해야합니다.
로그/트랙/메트릭에 열화 된 경로를 명시 적으로 표시합니다.
6) 우선 순위 및 트래픽 형성
VIP/유료 요금제-부족한 경우 더 높은 우선 순위/할당량.
속도 제한과 스로틀링은 의존성 저하에 대한 부담을 줄입니다.
헛간로드: 품질의 부드러운 감소 (예: 안정화 될 때까지 더 적은 결과, 잘린 이미지).
7) 관찰 및 신호
CB 지표
상태 (닫기/열기/반 열기) 및 상태 지속 시간.
원인에 의한 실패의 비율: CB- 오픈, 타임 아웃, 5xx, 재 시도 소진.
p95/p99 대기 시간 "전" 및 "후" 스위치.
폴백을 통한 요청 수/백분율.
추적
스팬의 주석: '회로 = 개방', '대체 = 캐시', '입학 = 거부'.
한계 (429/RateLimit-), 대기열 및 연결 총알과의 상관 관계.
로그/감사
개방/닫기, 임계 값, 종속성 ID의 이유.
8) 계약 및 의정서
모든 편지 선택 (C
실패: '재시도 후' (또는 '429') 가있는 '503 서비스 불가'.
부분 컨텐츠/부실: 성능 저하 메타 데이터가있는 '200 '/' 206' (예: 'X-Degraded: 참').
캐시 정책: '캐시 제어: 오래된 경우 오류, 부실한 상태'.
gRPC
'UNAVAILABLE', 'DEADLINE _ EXCEEDED' 는 클라이언트/프록시 정책에 따라 의미를 다시 트레이합니다.
요청 컨텍스트에 대한 마감일/시간 초과; 마감일을 체인 아래로 전파합니다.
이념성
POST 운영을위한 'Idempotency-Key', 국경에서의 중복 제거.
9) 일반적인 구현 (의사 코드)
pseudo onRequest(req):
if circuit. isOpen(dep):
return fallbackOrFail(req)
with timeout(T):
try:
resp = call(dep, req)
circuit. recordSuccess(dep, latency=resp. latency)
return resp except TimeoutError or 5xx as e:
circuit. recordFailure(dep)
if circuit. shouldOpen(dep):
circuit. open(dep, coolDown=adaptive())
return fallbackOrFail(req)
하프 오픈 샘플
pseudo onTimer():
if circuit. state(dep) == OPEN and coolDownExpired():
circuit. toHalfOpen(dep)
onRequestHalfOpen(req):
if circuit. allowTrial (dep): # e.g. 1 try: call -> success => close catch: reopen with longer coolDown else:
return fallbackOrFail(req)
10) 임계 값 설정
관찰 창: N 초/쿼리 슬라이딩.
오류 임계 값: 창에서 20-50% (프로파일에 따라 다름).
대기 시간 임계 값: p95 체 대상 SLO (예: 300-500 ms); 초과분은 CB의 "오류" 로 계산됩니다.
적응 형 냉각: 반복적 인 작동으로 10s → 30s → 60s.
11) 테스트 및 혼돈 관행
혼돈: 대기 시간/의존성 오류 주입, DNA 고장, 패킷 드롭.
게임 일: 전투와 같은 환경에서 스위치의 "개방" 을 시작하여 폴록을 확인하십시오.
카나리아: 트래픽의 1-5% 에 대해 POC/저하 정책을 사용하십시오.
SLO 예산: 오류 예산이 소진 될 때까지 실험을 허용하십시오.
12) 멀티 테넌시와의 통합
CB 상태는로드 프로파일에 따라 임차인 당 (시끄러운 임차인의 경우) 또는 전 세계적으로 저장할 수 있습니다.
'테넌트 _ id' 로 대체 데이터와 캐시를 세그먼트합니다.
우선 순위/할당량-계획에 따라 (VIP는 스타터 동작으로 고통받지 않아야 함).
13) 사전 판매 점검표
- 타임 아웃 및 마감일은 엔드 투 엔드 및 일관성이 있습니다.
- 배신은 백오프 + 지터를 사용하여 demempotent 작업에만 제한됩니다.
- CB 임계 값은로드 테스트 데이터로 정당화됩니다.
- 빠르고 안전한 낙하 경로가 존재합니다. 정책 캐시가 정의되었습니다
- 벌크 헤드 격리: 별도의 풀/대기열/제한.
- 메트릭/트레일/로그 플래그 저하 및 CB 상태.
- 샘플 헤더/코드가있는 응답 계약 문서 (해/gRPC).
- 혼돈 시나리오와 게임 일은 정기적으로 이루어집니다 런북이 있습니다.
14) 전형적인 오류
타임 아웃은 없습니다 → "완전히" 후퇴하고 계단식으로 떨어집니다.
선택적 (엔드 포인트/방법으로) 대신 단일 글로벌 CB-불필요한 실패.
폴록이없는 스위치 열기 → UX 저하 대신 "빈" 화면.
지터가없는 배신자 → 동기 요청 폭풍.
단기 고장으로 긴 냉각 또는 안정적인 "플립 플롭" 상태로 너무 짧습니다.
격벽의 부재-공유 수영장의 고갈 및 "헤드 오브 라인 차단".
15) 빠른 전략 선택
중요한 읽기: 오래된 응답의 CB + 캐시 + 헤징 (경제적).
기록/지불: 엄격한 타임 아웃, 최소 배상, demotency 키, 더러운 대체 없음.
외부 API: 공격적인 임계 값, 적응 형 냉각, 엄격한 스로틀 링이있는 CB.
맥동로드 마이크로 서비스: 벌크 헤드, 동시성 한도, VIP 우선 순위.
결론
서킷 브레이커와 관리 된 열화는 아키텍처 "보험" 입니다. 혼란스러운 실패를 예측 가능한 동작으로 변환합니다. 명확한 타임 아웃, 제한된 지터 퇴각, 격리 된 풀, 사려 깊은 대체 경로 및 원격 측정은 피크 및 충돌 기간 동안에도 시스템을 종속성 오류에 탄력적으로 만들고 SLO를 유지합니다.