inflearn logo
강의

Course

Instructor

Resilience4j - CircuitBreaker for creating fault-free services

n 대의 서버간 서킷 브레이커의 상태를 동기화 시키려면 어떻게 해야 될까요?

Resolved

517

Byung Hyun Choi

7 asked

1

가상의 상황

이 때 n 대의 서버간 서킷 브레이커의 상황을 필수적으로 공유해야 된다면 어떻게 할 것 인가?

 

생각하는 안

redis pub/sub 기능을 통해 구현한다.

  1. 1번 서버는 외부 연동 실패로 서킷브레이커가 open 되었다.

  2. 1번 서버는 onStateTransition 의 로직으로 open 상태를 redis 에 pub 한다.

  3. 2번 서버는 sub 하여 자신의 상태를 open 으로 동기화 한다.

하지만 우려되는 맹점이 있습니다.

그외


사실 실무라면 굳이 서버간 서킷 브레이커의 상태를 공유하지 않을 것 같습니다.

하지만 실무를 떠나 기술적인 방법은 무엇이 있을까 인사이트가 궁금합니다.

spring-boot msa circuit-breaker resilience4j

Answer 1

1

foo

Byung Hyun Choi 님 안녕하세요!

우선 좋은 질문 남겨주셔서 감사합니다. :)

 

기존에 비슷한 질문이 있었고, 아래 이와 관련해서 답변해드렸던게 있어서 링크 남겨둡니다.

https://www.inflearn.com/questions/1088598/comment/299713

 

그 외에 질문 주신 내용 중 첨언하고 싶은 부분들이 있어서 이야기 드립니다!

 

  1. pub/sub를 통한 동기화에서 발생할 수 있는 동시성 문제

-> 말씀해주신대로 미묘한 타이밍에 서로 open이 반복되면서 문제가 발생할 수 있긴 합니다. 그러나 실제로 발생할 가능성은 매우 낮아보여요. (CircuitBreaker가 열리는 상황이 보통 자주 있지 않고, 애플리케이션이 각각 open으로 빠졌다가 회복되는 시간의 간격이 동시성 문제를 야기할 정도로 짧지 않을 것 같습니다)

물론 종종 발생할 가능성은 분명 있습니다. 그러나 한번 정도 저 문제가 생기고 다시 정상적으로 동작할 가능성이 높지, 무한히 open으로 빠져버릴 가능성은 매우 낮아보입니다.

따라서 여기에 공유락을 사용하는건 불필요하게 시스템 복잡도를 높이는 문제가 생길 것 같습니다.

 

  1. '그러면 n 대의 서버에 상태 변경 명령을 어떻게하면 api 로 보낼 수 있나요?'와 관련된 Reverse Proxy 너머에 있는 호스트들에 대한 API 호출을 통한 동기화 문제

-> 이렇게 호출하는 것도 가능하긴 하지만, 문제가 될 수 있습니다. Reverse Proxy 너머에 있는 호스트들은 로드밸런싱되는 룰이 존재하고, 10대의 서버를 대상으로 10번 요청했을 때 일부 서버는 서킷 상태 변경 요청을 수신하지 못할 가능성이 있기 때문입니다. 물론 더 많은 요청을 보내면 모든 서버를 동기화 시킬 수 있겠지만, 여전히 모든 서버가 동기화되지 못할 가능성은 남아있을겁니다.

따라서 로드밸런싱이 되는 환경에서, 모든 서버를 가급적 동시에 동기화 시키기 위해서는 좋은 방법이 아닙니다.

 

일반적으로 이런 설정을 공유하기 위해서 가장 많이 사용되는 방법은 Spring Cloud, 그중에서도 Eureka를 활용한 동기화 입니다. 이런 툴을 '서비스 디스커버리'라고 이야기합니다. 관련해서는 예제 코드 찾아보시거나, ChatGPT에 '유레카를 통해 여러 애플리케이션의 Resilience4j CircuitBreaker 상태를 공유하는 예제 코드 보여줘' 같은 식으로 질문해보시면 동기화 해주는 예제 코드를 만들어줄겁니다. 한번 확인해보세요. :)

 

다만 이런 Spring Cloud 관련 라이브러리를 사용하고 싶지 않다면, 위에 이야기해주신 것처럼 Redis를 통한 pub/sub 혹은 Kafka를 통한 pub/sub 역시 괜찮은 수단일 것 같습니다. 물론 Redis나 Kafka를 이미 애플리케이션에서 사용하고 있다는 것을 전제로 이야기드리는거고, 사용하지 않고 있는데 오직 Circuit Breaker를 위해 추가하는건 과하다는 생각이 드네요.

 

질문에 대한 답변이 되었을까요?

또 궁금한 내용 있으면 질문 남겨주세요.
감사합니다!

1

Byung Hyun Choi

유레카를 이름만 들어보고 써보지는 않았는데, 이번 기회에 최소한 이론이라도 좀 더 봐야될 것 같습니다.
지금 생각나는 질문은 모두 해결된 것 같습니다. 감사합니다.

1

foo

넵!! 아 그리고 '사실 실무라면 굳이 서버간 서킷 브레이커의 상태를 공유하지 않을 것 같습니다.' 라고 이야기해주셨는데, 공유가 불필요한 서비스도 있고, 공유를 하는게 꼭 필요한 서비스들도 있어요. ㅎㅎ

 

다만 이걸 선택할 때는 공유가 될때와 안될때 어떤식으로 동작하는지 상상해보시면 좋을 것 같습니다.

 

공유하지 않았을 때는 Client가 호출했을 때 거의 같은 시간인데도 불구하고 어떤 상황에서는 API 호출이 성공(CLOSE or HALF_OPEN)할거고, 어떤 경우에는 실패(OPEN)하겠죠? 이 상황이 애플리케이션에 치명적이라면 반드시 공유하도록 만들어야하고, 치명적이지 않고 이런대로도 괜찮다고 한다면 공유하지 않아도 괜찮습니다.

그 외에도 Circuit Breaker를 통해 보호하고 싶은 리소스(요청을 차단해서 회복되길 기대하는 리소스)를 빠르게 회복시키기 위해서는 전체 요청을 차단시키는게 더 빠르게 회복시킬 수도 있습니다. 이러면 공유하는게 더 괜찮겠죠?

 

아무튼, 다각도로 공유하는게 적절한지 아닌지 판단해보시기 바랍니다.

패키지 구분에 대해 궁금한게 있습니다

0

7

1

스프링부트 서버 에러나요

0

17

1

2026.04에 추가된 강의 시청 불가

0

27

1

Service Create/Update Record 운용과 Delete Record 미운용의 차이 질문

0

18

1

인가 코드 발급(프론트 vs 백)

0

28

2

인텔리제이 MCP 서버 설정 관련

0

26

1

Sequence 관련 질문

1

32

2

Image Only Query

1

29

2

프롬프트, 스킬, sub-agent

0

31

1

도메인 모델에서 관계와 규칙을 구분하는 방법

0

37

2

현업에서 서킷브레이커 상태 전파를 할 때 Actuator를 사용 하시는지 궁금합니다!

1

109

1

recordException을 지정하지 않았을때 동작 방식 질문

0

145

3

Riot API Circuit Breaker 적용

1

278

2

Resilience4J 적절한 적용 예시인지 질문드립니다.

1

200

1

강의 자료 문의

1

317

2

scale out 환경에서 api 호출로 circuit 상태 변경하기

1

299

1

예외 선언 위치

0

273

1

Circuitbreaker 사용 주체

1

239

1

Retry 사용

1

255

1

slow call 관련 옵션을 무시할 수 있나요?

1

217

1

안녕하세요 강사님 질문있습니다!

1

293

2

컨테이너 환경에서의 circuitbreaker 상태 전파 방식 질문

1

512

2

Circuit Breaker의 적용처 판단

1

440

2

IgnoreException 동작이 주석의 설명과 좀 다른것같습니다

1

368

1