[Etc.]CircuitBreaker : 서킷브레이커

김피자·2023년 3월 9일
0

etc.

목록 보기
2/10
post-thumbnail

얼마 전, 서킷브레이커라는 용어를 처음 듣고 궁금해져서 공부하게됐다.


CircuitBreaker

서킷브레이커는 누전 차단기라는 뜻을 가지고 있다.
위키백과에는 누전 차단기는 전기 회로에서 과부하가 걸리거나 단락으로 인한 피해를 막기위해 자동으로 회로를 정지시키는 장치라고 나와있다.

서버에서 사용하는 서킷브레이커도 외부 API통신의 장애 전파를 막기위해 사용되고 장애를 탐지하면 외부와의 통신을 차단하는 역할을 한다.


MSA 패턴의 한계

앞 설명처럼 MSA패턴은 시스템을 여러 서비스 컴포넌트로 나누고 각 컴포넌트끼리 서로 호출을 하는 패턴이다.

이 패턴의 한계는 서버가 서로 종속적이라는 점인데 서버 A가 서버 B를 호출을 했을 때 server B가 응답을 못하거나 시간이 길어진다면 server A는 응답을 계속 기다려야한다는 한계가 있다.

MSA(마이크로서비스 아키텍처)에서는 각각의 서비스가 독립적으로 구성되어 운영되기 때문에, 서비스 간의 호출이 많아지게 된다.
하지만 이렇게하면 서비스 간의 의존성이 높아지고, 하나의 서비스에 장애가 발생하면 전체 시스템에 영향을 미칠 수 있다.

이러한 한게를 극복하기위해 MSA에서는 서킷 브레이커(Circuit Breaker) 패턴을 사용하여 이러한 문제를 해결하는데 서킷브레이커 패턴을 사용하면 새로운 서비스 추가와 변경에 용이하고 트래픽이 증가해도 유연하게 대처할 수 있게된다.

그림으로 보자

이렇게 클라이언트가 A에게 서비스를 요청하면 이를 처리하기위해 A는 B 서버에게 요청을 보낸다.

하지만 만약 B에서 서비스 장애가 발생하면 어떻게 될까?
B 서버에서 지연이 발생하면 응답 지연은 클라이언트에게도 전달될 것이다.

이 환경에서는 B 서버에서 발생한 지연 장애가 클라이언트까지 전파된다.

이러한 한계를 극복하기위해 CircuitBreaker 패턴을 사용한다.

### CircuitBreaker 패턴


이렇게 A와 B 사이의 CircuitBreaker를 통해 요청과 응답을 주고받다가 B에서 장애가 발생하여 응답 지연이 발생하면

CircuitBreaker는 B의 응답을 기다리지 않고 위의 그림처럼 중간에서 응답해버린다.

이런 구조로 클라이언트에게 응답지연이 발생하지 않는다.
즉, 서비스 장애의 전파를 막을 수 있다.

하지만!!!! B의 장애가 장시간 오래 지속된다면??

아무리 대신 응답을 해준다해도 서킷브레이커 자체도 일단 B에서 Time Out이 나기 전까지는 기다려야하는 상황이다. 그래서 B에 장애가 났음에도 일단 B를 게속 호출하고~ 타임아웃이면 대신 응답하고, 또 호출해보고 타임아웃이면 대신 응답하고

그래서 이런 점을 극복하기 위해 서킷브레이커는 임계치를 넘어서면 OPEN상태로 바뀐다.
이 상태가되면 A 서비스는 더이상 B 서비스로 호출을 하지 않는다.
즉, 모든 요청을 서킷브레이커에서 응답해버린다.

영원히 OPEN을 유지하는 것은 아니고 정해진 시간이 지나면 B 서비스를 호출해보고 정상 응답을 받으면 CLOSE한다.
주기적으로 서비스 정상 여부를 체크


출처
https://brunch.co.kr/@springboot/262
https://velog.io/@hgs-study/CircuitBreaker

profile
제로부터시작하는코딩생활

0개의 댓글