[MSA] - 4. Circuit Breaker를 이용한 장애 처리

MSA에 대해서 우리는 각 API 서버를 분리하여 용도별로 인스턴스를 나누고, 앞단에서 Gateway를 사용해 클라이언트가 원하는 서비스를 주고, 로드 밸런싱 등의 작업이 들어갈 경우, Service Discovery를 통하여 원하는 서비스를 동적으로 찾아주는 방법까지 알았습니다.

그런데, 이렇게 서비스를 분리함으로써 한 인스턴스가 모든 서비스를 감당하는 부분이 완화되는 등의 장점이 생겼지만, 만약 서비스에 장애가 발생한다면 그 장애는 어떻게 처리할 수 있을까요?

서비스가 분리되어 있는 상태에서 클라이언트의 잘못된 입력 값 등으로 생기는 오류는 논리적인 오류입니다. 따라서 이런 오류는 Exception 등의 처리를 통해서 클라이언트에게 오류를 알려주고, 이를 처리하는 방식으로 진행할 수 있습니다.

하지만 MSA에서 서비스 장애 처리의 어려움은 논리적인 오류가 아닌 물리적인 오류에 있습니다. 예를 들어서, MSA는 시스템을 여러 개 서비스 컴포넌트로 나누어서 서비스 컴포넌트 간에 호출하는 개념을 가지고 있는데, 그렇게 되면 컴포넌트끼리 통신을 하게 될 것이고, 통신 중 하나의 컴포넌트에서 인스턴스가 느려지거나, 장애가 발생하면 그것이 다른 컴포넌트에서도 똑같이 적용되는 이른 바 '전파'라는 특성이 있는 것이죠.

 

쉬운 설명을 위해서 위 이미지를 보면, User API에 저장된 카페 주문 메뉴를 가져오기 위해 Cafe API에서 정보를 요청했습니다. 그러나 Cafe Service에서는 응답이 없는 경우, 이러한 현상이 User Service에도 동일하게 나타나며 오류를 전파시키는 현상을 발생합니다.

 

Circuit Breaker

위와 같은 문제를 방지하기 위해 우리는 Circuit Breaker를 사용할 수 있습니다. Circuit Breaker를 간단히 설명드리자면, 각 컴포넌트 구간 중간에 추가적으로 컴포넌트를 하나 두고, 이 컴포넌트에서 보내고자 하는 서비스의 상태를 미리 확인한 다음, 데이터를 전송할 수 있도록 해주는 Observer 역할을 하게 됩니다.

 

 

서비스가 정상적인 상태로 운영 중이라면, Circuit Breaker는 대상 서비스로 통신을 시키게 되고, 그렇지 않은 경우에는 오류를 반환시킵니다. 이렇게 중간 역할을 하여, 서버의 상태를 점검해줌으로써 오류의 전파를 막을 수 있습니다.

 

마치며...

이번 파트에서는 간단하게 Circuit Breaker가 왜 필요한지, 어떻게 동작하는지에 대해서 다뤄봤습니다. 이러한 서비스에 대표적인 것에는 Netflix에서 개발한 Hystrix가 있고, Spring Cloud의 Spring Circuit Breaker도 존재합니다.

다음 포스트에서는 Spring Stack의 Circuit Breaker를 다뤄보도록 하겠습니다.

 

 

comments powered by Disqus

Tistory Comments 0