서킷 브레이커
서킷 브레이커
시스템 장애의 전파를 방지하고 고가용성을 유지하도록 하는 디자인 패턴이다
MSA나 분산 시스템에서 유용하다
서비스가 실패하거나 과부하 상태에 있을 때 해당 서비스를 계속 호출하는 것을 중지하고 시스템이 정상 상태로 복구될 때까지 일정 시간 대기하도록 하는 방식으로 동작한다
서킷 브레이커가 필요한 경우
서비스 장애로 인한 시스템 과부하 방지
MSA 또는 분산 시스템에서는 여러 서비스가 상호 작용을 하는데 이때 만약 하나의 서비스가 다운되거나 느려지면 해당 서비스에 의존하는 다른 서비스들도 영향을 받을 수 있다
서킷 브레이커는 장애가 발생한 서비스에 대한 추가 호출을 차단하여 시스템 전체가 마비되는 것을 방지하고 다른 서비스들이 정상적으로 동작할 수 있도록 한다
복구 시간 확보
장애가 발생한 서비스에 대해 일정 시간동안 호출을 차단하고 이후 재시도를 통해 서비스의 복구 여부를 확인한다
장애가 있는 서비스를 계속 호출하며 발생하는 리소스 낭비를 방지한다
장애 발생 후 일정 시간 대기, 서비스 복구 여부 점검을 통해 해당 서비스 호출을 다시 시도할 수 있도록한다
시스템의 응답 시간 개선
장애가 발생한 서비스에 지속적으로 요청을 보낼 경우 시스템 응답이 시간이 길어지거나 타임아웃이 발생할 수 있다
서킷 브레이커를 사용하면 장애가 발생한 서비스에 대한 요청은 차단하고 다른 서비스들에 대한 요청은 정상적으로 응답하여 시스템의 전체적인 응답 시간 개선에 도움을 준다
서킷 브레이커 동작 원리
Closed (닫힘 상태)
정상 상태로 서킷 브레이커는 닫힘 상태이다
해당 상태에서는 서비스 호출이 정상적으로 이루어지며 문제가 발생하는 경우 실패 횟수를 기록하고 일정 횟수를 넘겼을 때 '열림' 상태로 전환된다
Open (열림 상태)
장애가 발생한 서비스에 대해 호출을 더이상 보내지 않도록 차단하는 상태이다
해당 상태에서는 일정 시간동안 장애 발생된 서비스를 호출하지 않고 해당 서비스가 복구될 때까지 대기한다
대기 시간이 지나면 다시 '반열림' 상태로 전환되어 해당 서비스가 복구되었는지 확인한다
Half-Open (반열림 상태)
장애가 발생했던 서비스에 대해 일부 요청을 보내서 해당 서비스가 복구되었는지 확인하는 상태이다
복구되었다면 '닫힘' 상태로 전환하고 지속적으로 문제가 있다면 '열림' 상태로 돌아간다
서킷 브레이커 패턴을 사용하는 기술
Hystrix
Netflix에서 만든 Hystrix는 서킷 브레이커 패턴을 구현한 라이브러리이다
장애를 감지하고 시스템의 회복성을 높이는데 도움을 준다
타임아웃 설정, fallback 메커니즘 등을 제공하여 장애가 발생했을 때 대체 경로를 설정할 수 있다
Resilience4j
Hystrix의 후속으로 Java에서 사용할 수 있는 서킷브레이커 라이브러리이다
Hystrix의 기능을 확장하고 더 가벼운 구현체로서 슬라이딩 윈도우와 같은 기능을 제공한다
서킷 브레이커의 장점
시스템 안정성 증가
장애가 발생한 서비스를 계속 호출하는 것을 방지하여 시스템의 다른 부분에 미치는 영향을 최소화한다
고가용성 유지
장애가 발생한 서비스가 완전히 복구될 때까지 다른 서비스들이 정상적으로 작동할 수 있도록 한다
장애 격리
하나의 서비스 실패가 시스템 전체로 확산되지 않도록 하여 장애를 격리할 수 있다
시스템 자원 절약
서비스 장애에 계속 호출을 보내는 것보다 자원을 절약하여 시스템 성능을 유지할 수 있다
Fallback 메커니즘
Fallback은 서킷 브레이커가 '열림' 상태일 때 대체 동작을 정의하는 메커니즘이다
서비스 호출이 실패했을 때 대체할 수 있는 다른 로직이나 데이터를 제공
주로 임시 데이터 반환, 기본값 제공, 캐시 활용 등이 사용된다
Fallback은 장애가 발생했을 때 사용자가 대기하거나 실패한 서비스로 인해 큰 피해를 입지 않도록 도와주는 중요한 역할을 한다
Threshold (임계값)
서킷 브레이커는 장애를 감지할 때 특정 기준을 사용하여 활성화된다
해당 기준은 서비스 호출의 실패 횟수, 응답 시간 등을 기준으로 설정할 수 있다