본문 바로가기

MSA

[MSA]Circuit Breaker를 활용하여 부분 실패를 막자

MSA를 적용한 서비스에서 "부분 실패"가 발생한다면?

MSA를 적용한 서비스는 여러 개 서비스 컴포넌트로 구성되고, 각 컴포넌트 간 호출을 하는 방식으로 독립적이지만 느슨하게 연결되어 있다. (Losely coupled) 이런 방식에는 하나의 컴포넌트에 장애가 발생하면 그것에 종속된 컴포넌트까지 장애가 전파되는 단점이 있다.

이해를 돕기 위해 "배달의 민족"과 유사한 배달 서비스를 생각해보자. 배달 서비스는 MSA를 적용하여 주문과 결재가 각각 독립적인 서비스로 구성되어있다고 하자. 위 그림에서 server A가 주문 서비스라고 하고, server B가 결재 서비스라 하자. 주문 서비스는 api호출을 통해 결재 서비스와 통신을 하는데, 결재 서비스에 문제가 생겨 응답을 하지 못하는 상황에 처했다면, 주문 서비스의 모든 스레드는 결재 서비스의 응답을 기다리는 데 사용될 것이다. 이렇게 되면 주문 서비스는 클라이언트의 주문 요청에 대한 응답을 하지 못한다. 결재 서비스의 장애가 주문 서비스로 전파된 사례이다.

 

circuit breaker pattern

장애가 전파되는 단점을 해결하기 위해, service A와 service B 사이에 circuit breaker를 설치하는 방법이 있다. 이는 회로 차단기라는 의미로 소프트웨어에서 오류를 탐지하는 역할을 한다. 다음은 Martin Fowler가 말한 circuit breaker이다.

여기서는 server A, server B간의 MSA가 아니라, client와 supplier 간의 관계가 나타나 있지만, 서로 호출을 하고 정보를 주고받는다는 의미에서 동일하다. 개념은 간단하다. supplier를 오류 검출할 수 있는 circuit breaker로 한번 감싼다고 보면 된다. 만약, supplier에 장애가 생겨 timeout이 발생한다면, circuit breaker 측에서 강제적으로 호출을 끊어 client의 스레드가 더 이상 대기 중인 상태로 남지 않도록 한다. 따라서 supplier의 장애가 client의 장애로 전파되지 않는다.

 

다시 주문과 결재의 경우로 생각해보자. 결재 서비스가 먹통이 되었다면, circuit breaker는 주문 서비스에게 결재 서비스에 timeout이 발생했다고 알려주고, 더 이상 호출을 하지 않는다. 여기서 주문 서비스는 에러를 처리하는 별도의 로직이 필요하다. 예를 들어 timeout이 얼마 이상이어야 결재 서비스의 장애로 판단할지, 주문 서비스에는 어떠한 메시지를 띄울지(이를 Fall-back 메시징이라 한다.) 등등이 있다. 결국 이를 활용하여 주문 서비스는 계속 이용할 수 있어, 전체 서비스의 가용성이 높아진 격이다. 물론 결재 서비스를 최대한 빨리 고쳐서 정상화할 필요가 있지만 말이다.

 

Netflix Hystrix

circuit breaker의 개념은 쉽지! 실제로 구현을 해보라하면 그렇게 쉽지는 않을 것이다. 이 분야에서 Netflix가 잘했는데, 더 잘한 것은 이것을 오픈소스화했다는 점이다. 나중에 필요할 때 찬찬히 읽어보고 꼭 써보자. 이미 발명된 바퀴는 다시 발명할 필요는 없으니 말이다.

 


쿠팡의 Circuit breaker도입 사례: Valve

쿠팡은 circuit breaker로써 Valve를 사용했다.

valve는 수많은 마이크로 서비스 간 통신을 모니터링하여, 장애가 발생했을 시 작동하게 되어있다. 장애가 발생한 서버를 자동으로 제거하고 새로운 서버를 넣어서 사업적 손실을 최소화하는 장치이다. 예를들어 쇼핑카트라는 마이크로 서비스에 장애가 발생한다면 Valve가 상품 페이지에서 쇼핑카트라는 버튼을 비활성화하여 소비자들이 카트 페이지로의 이동 없이 곧바로 물건을 구매할 수 있도록 하는 것이다.


출처

https://martinfowler.com/bliki/CircuitBreaker.html

 

bliki: CircuitBreaker

You use software circuit breakers on connections to remote services. These breakers trip when the supplier becomes unresponsive, once tripped the breaker no longer calls the supplier until reset.

martinfowler.com

https://oingdaddy.tistory.com/162

 

[MSA 시작 #5] Netflix Hystrix를 이용한 Circuit Breaker 쉽게 구현하기

현재까지 Service Discovery, API Gateway, Configuration Externalization 등을 통해 MSA 수박 겉을 핥아보고 있다. 간단하게 현재까지 이런저런 기능을 구현했었는데 장애가 발생하는 경우에 대해서는 다룬적이..

oingdaddy.tistory.com

https://bcho.tistory.com/1247

 

Circuit breaker 패턴을 이용한 장애에 강한 MSA 서비스 구현하기 #1 - Circuit breaker와 넷플릭스 Hystrix

Circuit breaker 패턴을 이용한 장애에 강한 MSA 서비스 구현하기 #1 Circuit breaker와 넷플릭스 Hystrix 조대협 (http://bcho.tistory.com) MSA에서 서비스간 장애 전파 마이크로 서비스 아키텍쳐 패턴은 시스템..

bcho.tistory.com