Circuit Breaker Pattern의 필요성
서비스 개발을 하다보면 외부 API를 호출해야 하는 경우가 생기게 된다. 이러한 외부 API 호출 시, 호출 실패를 고려하지 않을 수 없는데, 호출 이후 request가 타임아웃 될 때까지 쓰레드풀이나 DB풀을 선점하고 있거나, 메모리를 잡아먹으면서 점차 리소스가 부족해지고, 장애가 전파되어 다른 부분까지 문제가 발생할 수 있다. 또한 장애가 발생한 서버에 계속 요청을 보내는 경우 부하를 받아 장애 복구를 힘들게 만든다. 따라서 장애가 발생한 서비스를 탐지하여 요청을 보내지 않게 차단할 필요가 생기게 되었다.
Circuit Breaker Pattern의 동작
이 패턴은 Releasse It이라는 서적에서 처음 소개된 패턴이다. 전기의 회로 차단기에서 차용하여 이름이 circuit breaker 패턴이다.
일반적으로 회로가 닫혀있으면(close되어있으면) 전류가 흐르게 된다. 하지만 전류가 흐르다가 문제가 생겨 전류가 흐르면 위험한 상황이 되면 회로 차단기는 자동으로 회로를 open하여 더이상 전기가 흐르지 않도록 하여 위험한 상황을 방지한다.
서킷 브레이커 패턴은 이러한 회로 차단기로부터 아이디어를 얻어 만들어졌다.
Circuit Breaker의 3가지 상태
Closed: 모든 것이 정상인 상태
Open: 외부에 장애가 발생한 상황
Half Open: Open 상태가 되고 일정 시간이 지난 상황, 일부 허용된 요청들이 성공할 경우 Closed상태로 전환
여기서 외부 장애가 발생했다고 판단하는 기준은 크게 2가지로 나뉜다.
- 기준 시간보다 오래 걸린 요청 (timeout)
- 실패하거나 오류를 응답받은 요청
이 2가지 장애 상황에 대해서 특정 기준을 적용하여 규칙을 만들어 서킷 브레이커 패턴을 동작한다.
- 특정 요청이 3번 연속 실패 시, Open상태로 변경
- 특정 요청이 3번 연속, 5초 이상 시간 초과 할 경우 Open상태로 변경
- Open상태로 바꿨던 요청이 3번 이상 성공할 경우 다시 Closed
동작 예시
- 정상 실행중이며 Closed 상태
- 외부 서버 장애 발생
- 요청이 계속해서 실패하고 Open조건을 만족하여 회로가 Open상태로 변경됨
- 이후 요청들은 차단되어, 빠르게 실패 응답을 반환
- 외부 서버 정상 복구
- 회로가 Open 된 지 일정 시간이 지나 Half Open 상태로 변경됨
- 일부 요청들을 외부 서버로 전달하고, 응답에 성공 시 Closed 상태로 변경
- 만약 Half Open상태에서 외부 서버가 복구되지 않아 요청들이 또 실패한다면 다시 Open상태로 변경될 수도 있다.
- 정상 실행중이며 Closed 상태
서킷 브레이커 패턴은 이렇게 상태변경이 자동으로 수행되게 할 수 있다.
Circuit Breaker의 장점
- 장애 감지 및 격리
- 위에서 설명했듯이 장애가 발생한 서비스를 호출한다면 타임아웃 될 때까지 쓰레드풀이나 DB풀을 선점하고 있거나, 메모리를 잡아먹으면서 점차 리소스가 부족해지고, 다른 부분들에도 장애가 전파되어 다른 부분까지 문제가 발생할 수 있다.
- 서킷 브레이커는 장애가 발생한 서비스를 감지하고 더 이상, 요청을 보내지 않도록 차단하여 장애를 격리시켜 장애가 발생한 기능 외의 다른 기능들은 동작하도록 해준다.
- 자동 시스템 복구
- 서킷 브레이커 패턴은 Closed, Open, Half Open 3가지 상태에서 조건에 따라 자동으로 상태변경이 일어나므로 개발자들이 신경쓰지 않아도 된다. 모니터링 기능까지 제공하며, 대시보드를 통해 연동 현황을 모니터링 가능하다.
- 빠른 실패 응답 가능
- 장애 발생 시, 가능한 빠르게 실패를 반환할 수 있다.
- 장애 서비스로의 부하 감소
- 서비스가 완전히 죽지 않는다면 계속하여 요청을 보낼 시, 외부 서비스의 상황을 더 악화시켜 장애를 유발할 수 있다. 이때 외부 서비스가 안정을 찾도록 요청을 멈추는 것이 좋은데, 서킷 브레이커를 사용하면 자동으로 가능하다.
- 장애 대안
- 장애 발생 시, 원하는 응답이나 데이터를 얻지 못한다. 이때 아무런 대응책이 없다면 클라이언트 서비스 역시 장애가 발생하게 된다. 서킷 브레이커를 적용한다면 자체적으로 캐싱해 둔 값으로 응답하는 등 장애에 대한 대안을 커스터마이징 할 수 있다.
Spring의 서킷 브레이커 라이브러리
- Hystrix : 넷플릭스에서 만든 오픈소스, 그러나 현재는 유지보수가 더이상되지 않아 사용권장 하지 않음
- 2018년에 넷플릭스가 더 이상 개발하지 않는다고 발표..
- Resilience4j : 함수형 프로그래밍으로 설계된 경량 장애 허용 라이브러리로 서킷브레이커 패턴을 위해 사용
'Back-end' 카테고리의 다른 글
[Kotlin+Spring] 자주 사용하는 변환식 확장 함수(Extension Function) Util로 관리하기 (1) | 2024.11.05 |
---|---|
AWS CloudWatch 경보 Slack으로 전송하기 (0) | 2024.01.09 |
[SpringBoot] 프로젝트 리소스 파일 가져오기 (0) | 2022.11.29 |
자바 직렬화(Serializable) (0) | 2022.10.04 |
HTTP Method & Patch 등장에 따른 Dispatcher Servlet의 변화 (0) | 2022.08.02 |