개발

Circuit Breaker

서킷 브레이커

Circuit Breaker는 실패가 잦은 원격 호출을 일정 기준에서 아예 차단해 장애가 번지는 것을 막는 패턴입니다. 마틴 파울러는 2014년 글에서 보호할 호출을 감시 객체로 감싸고, 실패가 기준치에 도달하면 회로를 열어 이후 호출은 실제 요청 없이 즉시 오류를 돌려준다고 설명합니다. 상태는 닫힘·열림·반열림 세 가지이며, 반열림에서 시험 호출이 성공하면 다시 닫힙니다. 마이클 나이가드가 Release It!에서 정리한 안정성 패턴 중 하나입니다.

쉽게 말하면?

서킷 브레이커는 집 배전반의 누전 차단기와 같은 이름입니다. 한 방에서 전기가 새면 차단기가 내려가 집 전체가 타는 것을 막습니다. 서버도 마찬가지라, 응답이 느린 외부 서비스를 계속 부르면 우리 서버의 스레드까지 말라붙어요. 차단기를 달아 두면 그 호출만 빠르게 실패시키고 나머지는 살립니다.

한 줄로 비유하면?

집 배전반의 누전 차단기입니다. 한 방을 끊어 집 전체를 살립니다.

어디에 쓰이나?

케이스 1넷플릭스 — Hystrix

넷플릭스는 원격 시스템 접근 지점을 격리해 연쇄 장애를 막는 Hystrix 라이브러리를 만들었습니다. 스레드 풀 격리와 차단기 상태 기계를 결합한 구조입니다. 기본값은 요청 임계수 20건, 오류율 50%, 대기 창 5초입니다.
도입효과: 스레드 격리로 처리하는 Hystrix 명령 실행 건수 일 100억 건 이상(프로젝트 위키 기준)[3]

케이스 2우아한형제들 — 공통 플랫폼 연동에 Resilience4j 적용

우아한형제들은 검색·광고·쿠폰을 사내 공통 플랫폼으로 옮기면서 동기 연동이 만드는 강한 의존과 장애 전파를 문제로 짚었습니다. Spring Cloud Hystrix가 유지보수 모드로 들어간 점을 고려해 Resilience4j를 골랐습니다. 차단기 상태는 프로메테우스와 그라파나로 봅니다.
도입효과: 슬라이딩 윈도 10회, 실패율 기준 50%, 열림 상태 대기 10초(2024-01-11 공개 설정값)[6]

케이스 3화해 — 파이썬 자체 구현과 레디스 공유 상태

화해는 Hystrix와 Resilience4j가 자바 생태계이고 파이썬 대안은 검증이 부족하다고 보고 차단기를 직접 만들었습니다. 인스턴스마다 상태가 갈라지는 문제는 레디스로 상태를 공유해 풀었습니다. 실제로 ML 서빙 API 장애 때 차단기와 대체 응답이 동작했습니다.
도입효과: 실패율 기준 80%, 최소 호출 수 900건, 시간 기반 윈도 300초, 150 TPS 부하에서 레디스 CPU 4% 미만(2024-08-29)[7]

케이스 4라인 — Armeria에 차단기 내장

라인은 사내 오픈소스 비동기 통신 라이브러리 Armeria에 차단기를 넣었습니다. 한 네트워크가 갑자기 응답하지 않으면 연쇄 장애로 이어진다는 문제의식에서 출발했습니다. 실패율 기준과 최소 요청 수, 윈도 기간을 설정할 수 있게 만들었습니다.
도입효과: 내장 제공 시작 버전 0.13.0, 설정 항목 3종(실패율 기준·최소 요청 수·윈도 기간)(2016-07-24)[8]

주의할 점은?

오늘 바로 해보기
1. 외부 의존 호출 중 가장 느린 것 하나를 골릅니다.
2. 최근 한 달 실패율과 응답 시간 분포를 확인합니다.
3. 실패율 기준과 최소 호출 수를 우리 트래픽 규모에 맞춰 정합니다.
4. 차단됐을 때 돌려줄 대체 응답을 먼저 정의합니다.
5. 차단기 상태 변화를 지표로 내보내 대시보드에 올립니다.

한계와 진화
모두가 차단기를 권하지는 않습니다. AWS Builders' Library의 마크 브루커는 차단기가 테스트하기 어려운 모드 동작을 만들고 복구 시간을 크게 늘릴 수 있다고 지적하며, AWS는 재시도를 로컬 토큰 버킷으로 제한하는 쪽을 선호한다고 적었습니다. 또 대표 구현이던 Hystrix는 1.5.18에서 멈춰 유지보수 모드로 들어갔고, 넷플릭스 스스로 활성 프로젝트를 권합니다.

기준값은 그대로 복사하면 위험합니다. 같은 패턴이라도 우아한형제들은 10회 윈도에 실패율 50%를, 화해는 900건 윈도에 실패율 80%를 썼습니다. 트래픽 형태가 다르면 기준도 달라야 합니다. 낮은 트래픽에서는 비율 기반 차단이 오작동하므로 최소 요청 수를 반드시 같이 정해야 합니다.

참고 자료

  1. Martin Fowler, Circuit Breaker (bliki, 2014-03-06) https://martinfowler.com/bliki/CircuitBreaker.html
  2. Michael Nygard, Release It! Second Edition (Pragmatic Bookshelf, 2018-01-09) https://pragprog.com/titles/mnee2/release-it-second-edition/
  3. Netflix Hystrix Wiki, How it Works https://github.com/netflix/hystrix/wiki/how-it-works
  4. Netflix Hystrix Wiki, Configuration https://github.com/netflix/hystrix/wiki/configuration
  5. Resilience4j Docs, CircuitBreaker https://resilience4j.readme.io/docs/circuitbreaker
  6. 우아한형제들 기술블로그, 개발자 의식의 흐름대로 적용해보는 서킷브레이커 (2024-01-11) https://techblog.woowahan.com/15694/
  7. 화해 기술블로그, 내부통신에 서킷브레이커 적용하기 (2024-08-29) https://blog.hwahae.co.kr/all/tech/14541
  8. LINE Engineering, Circuit breakers for distributed services (2016-07-24) https://engineering.linecorp.com/en/blog/circuit-breakers-for-distributed-services/

대표 출처

Martin Fowler, Circuit Breaker (bliki, 2014-03-06)