서킷 브레이커
실패가 임계(3회)에 닿으면 회로가 열려 요청이 하류에 가지도 않고, 반열림의 시험 요청 하나로 회복을 확인해 닫히는 상태 기계를 실행한다.
1 / 7서킷 브레이커: 실패가 3번 쌓이면 회로를 열어(open) 죽어가는 서비스에 요청을 그만 보냅니다.
호출자
→서킷 브레이커닫힘 — 정상 흐름
→하류 서비스정상
단계 목록 · 키보드 ←/→ 이동, Space 재생
서킷 브레이커는 '죽어가는 서비스에 그만 보내는' 장치다 — 실패가 임계에 닿으면 회로를 열어 즉시 실패시키고, 하류가 회복할 숨을 준 뒤 시험 요청으로 조심스럽게 닫는다.
왜 헷갈리는가
재시도와 반대 방향이라는 것이 자주 놓친다. 재시도는 '한 번 더 보내기', 브레이커는 '아예 안 보내기' — 하류가 과부하로 죽어갈 때 재시도는 독이고 브레이커가 약이다. 또 하나: 열림 상태의 즉시 실패는 버그가 아니라 기능이다(빠른 실패가 스레드 고갈을 막는다).
애니메이션이 보여주는 것 — 세 상태
닫힘(정상): 요청이 흐르고 실패를 센다. 열림(차단): 임계 도달 후 요청이 하류에 가지도 않고 즉시 실패 — 죽어가는 서비스를 더 때리지 않고, 기다리다 스레드가 마르는 연쇄 장애(cascading failure)도 막는다. 반열림(시험): 타임아웃 뒤 요청 하나만 보내 본다 — 성공이면 닫고, 실패면 다시 연다.
실무 설계 지점
구현체(resilience4j, Envoy outlier detection, Hystrix 계보)가 공통으로 묻는 것들.
- 임계 정의: 횟수보다 '슬라이딩 윈도 내 실패율 50% + 최소 호출 수'가 표준 — 새벽 1건 실패로 열리면 곤란하다.
- 열림 시간: 하류의 회복 시간 감각으로. 너무 짧으면 열자마자 다시 때리고, 너무 길면 회복된 서비스를 계속 차단한다.
- 폴백 설계가 본체: 열렸을 때 무엇을 보여줄 것인가 — 캐시된 값, 기본값, 기능 숨김. '즉시 실패'를 사용자에게 그대로 던지면 반쪽 구현이다.
- 범위: 브레이커는 하류 서비스별(가능하면 엔드포인트별)로 — 결제 API가 아프다고 전체 외부 호출을 차단하면 안 된다.
- 재시도·타임아웃과의 합주: 타임아웃(개별 호출 포기) → 재시도(백오프+지터) → 브레이커(집단 차단) 순으로 겹겹이 선다.
기억할 것
- 닫힘=흐름+계수, 열림=즉시 실패(보호), 반열림=시험 1발.
- 즉시 실패는 기능이다 — 기다림이야말로 스레드를 말리는 독.
- 임계는 실패율+최소 호출 수로, 열림 시간은 하류 회복 감각으로.
- 폴백이 본체 — 열렸을 때 사용자가 무엇을 보는지까지가 설계다.