코딩 하는 가든

Spring Webflux에 Resilience4j를 이용해 서킷브레이커 패턴 구현하기 - (1) 본문

Spring (boot)

Spring Webflux에 Resilience4j를 이용해 서킷브레이커 패턴 구현하기 - (1)

가든리 2021. 5. 2. 21:37

이번 글에서는 실제 구현은 없고 서킷 브레이커 패턴에 대한 설명을 합니다.

 

마이크로 서비스 아키텍처라는 단어가 세상에 나온지도 10년이 지났습니다. 비대해지는 모놀로틱 아키텍처에서는 여러가지 문제(유지 보수의 어려움, 오래 걸리는 컴파일 및 빌드 시간 등)가 발생 하였고, 이 문제들에서 벗어날 수 있는 방법 중에서 마이크로 서비스 라는 아키텍처가 대세로 떠오르게 되었습니다.

 

마이크로 서비스는 하나의 거대한 애플리케이션을 작은 기능을 하는 여러개의 애플리케이션으로 나누어 각각의 서비스가 따로 구동 되고 배포 될 수 있는 환경을 갖추게 됩니다.

마이크로 서비스 아키텍처에 대한 글은 아니므로 자세한 설명은 잘 작성된 다른 블로그의 글로 대체 합니다.[마이크로 서비스 아키텍처에 대해 잘 설명된 글]

 

하지만 마이크로 서비스 아키텍처도 만능은 아닙니다.(물론 지금도...) 마이크로 서비스 아키텍처라는 패러다임이 이렇게 활발히 사용되기까지 여러 시행 착오가 있었을 것이고 여러 문제들을 해결하기 위한 고민들이 있었을것입니다.

 

오늘은 그 중에 CircuitBreaker 패턴에 대해서 알아보겠습니다.

 

(사실 서킷 브레이커는 msa 환경 뿐만 아니라 외부 api 호출이 일어나는 상황에서는 어디든지 적용 가능 합니다. 하지만 외부 api호출이 활발하게 일어나는 msa환경에서의 서킷브레이커 패턴 적용이 더 많은 사례와 요구가 있을 듯 하여 msa환경이라는 전제조건을 붙이게 되었습니다.)

 

CircuitBreaker Pattern

서킷 브레이커는 개발뿐 아니라 다른 분야에서도 쓰이는 용어 입니다. (전기, 주식, 스타크래프트 등)

서킷 브레이커는 과부하로 인해 문제가 발생하는 것을 방지 하기 위하여 과부하를 주는 원인을 차단 하는 역할을 합니다.

예를 들어 주식 시장에서는 빠른 시간 내에 주가가 급락, 급등 할 때 시장의 과열을 막기 위해 잠시 동안 매매가 정지 되는데 이것을 서킷 브레이커가 발동되었다고 합니다.

 

그럼 개발계에서의 서킷브레이커는 어떤 상황에서 쓰일 까요? 아래와 같은 MSA 구조가 있다고 해보겠습니다.

 

이 상황에서 만약 어떤 서비스에 장애가 발생 한다면 그 장애로 인해 다른 서비스 까지 장애 상황을 겪게 될 수 있습니다.

이러한 상황을 '장애가 전파 된다.' 라고 합니다.

서킷 브레이커 패턴은 이러한 상황을 방지 하기 위해 존재 합니다.

 

서킷 브레이커는 어떤 API를 호출하는데에 있어 서킷 브레이커를 두어 장애가 발생한 서버로의 호출을 차단 하게 됩니다.

 

사실 이렇게만 보면 이렇게 생각 할 수도 있습니다.

'외부 API를 호출하는 서버에 exception 처리만 잘 해주면 되는거 아니야?'

서킷 브레이커는 장애로부터 우리의 서버를 지켜 주는 역할도 하지만 호출 하는 서버를 지켜줄 수 있는 역할을 하기도 합니다.

위의 그림에서 serviceA가 TimeOutException 을 던진다고 가정 해 봅시다. serviceA가 완전히 응답 할 수 없는 상황이기에 익셉션을 던진 것 일 수도 있지만 애플리케이션에서 정의한 timeout이 일어난 것 일 수도 있습니다.

예를 들어 serviceA는 완전 죽지는 않았지만 slow query등의 이슈로 인해 가용 thread가 더 이상 남아 있지 않을 수 도 있습니다. 이러한 상황에서 계속 해서 요청이 들어 온다면 불난 집에 기름을 붓는 꼴이 되어버릴 것 입니다.

이러한 상황에서 serviceA가 안정을 찾기 위해 요청을 잠시 멈춰주는 전략 또한 서킷 브레이커를 통해 구현 할 수 있게 됩니다.

 

CircuitBreaker 구현체

서킷브레이커의 구현체로는 대표적으로 Netflix사에서 만든 Hystrix가 있었으나 더이상 개발 되지 않고 Hystrix에서도 오픈소스인 resilience4j를 사용 하라고 권하고 있습니다.

 

resilience4j는 글 작성일 기준 10일 전에 마지막 커밋이 되었고 이슈나 풀리퀘스트가 꾸준히 올라오는 활발한 오픈소스 프로젝트 입니다.

 

 

다음 글에서는 이 resilience4j를 이용하여 서킷 브레이커 패턴을 직접 구현 해 보도록 하겠습니다.