인프런 커뮤니티 질문&답변

fbfbf1님의 프로필 이미지
fbfbf1

작성한 질문수

장애 없는 서비스를 만들기 위한 Resilience4j - CircuitBreaker

어떤 예외를 recordExceptions로 지정할까?

예외 선언 위치

해결된 질문

작성

·

146

0

안녕하세요

백엔드 A -> 백엔드 B로 호출하는 상황이라고 가정합니다.

백엔드 B에서 발생하는 CustomException을 CircuitBreaker에서 카운팅하지 않게 하기 위해서 ignoreExceptions에 추가한다고 하는 상황입니다.

 

그럼 이때 application.yml의 ignoreExceptions에 CustomException을 추가한다고 한다면 CustomException 정보는 백엔드 B에 있으니 백엔드 B의 설정에 추가를 하는 게 맞나요?

답변 1

0

이준형(Foo)님의 프로필 이미지
이준형(Foo)
지식공유자

fbfbf1님 안녕하세요.

 

'백엔드 A -> 백엔드 B로 호출하는 상황이라고 가정'했다는 것 자체가 보호하고 싶은 시스템이 '백엔드 A'인것 아닌가요?

해당 상황을 가정했는데, 마치 '백엔드 B'가 보호 대상인 것처럼 지칭하셔서 여쭤봅니다.

다만, 질문 주신 상황 자체만 놓고보면 백엔드 B에서 발생하는 CustomException을 카운팅하지 않으려면 백엔드 B에 ignoreExceptions 설정을 추가하는게 맞습니다!

fbfbf1님의 프로필 이미지
fbfbf1
질문자

안녕하세요, 먼저 답변 감사드립니다.

답변을 보고 궁금한 점이 더 생겨서 질문 드립니다.
1. 보호하고 싶은 시스템이 어떤 의미인가요??
2. 백엔드 B에서 발생하는 CustomException을 카운팅하지 않으려면 백엔드 B에 ignoreExceptions 설정을 추가 이렇게 답변 주셨는데 그럼 결국 CircuitBreaker를 사용하려면 백엔드 A와 백엔드 B 둘 다 CircuitBreaker 설정을 추가해주는 게 맞는건가요? 저는 백엔드 A에만 설정을 추가해주면 된다고 생각을 했었어가지고요

 

이준형(Foo)님의 프로필 이미지
이준형(Foo)
지식공유자

질문에 대해 하나씩 답변드려보면,

 

1. 보호하고 싶은 시스템이 어떤 의미인가요??

-> 제가 이야기한 보호하고 싶은 시스템은, CircuitBreaker를 통해 장애 또는 과부하로부터 안정성을 유지하고자 하는 시스템이나 서비스를 의미합니다. A -> B를 호출하는 상황을 가정하셨기 때문에 A와 B 사이의 문제만 놓고 이야기하시는 것 같아서 이야기 드렸습니다. 둘 사이의 관계만 이야기하면 일반적으론 A를 보호하고 싶은 시스템으로 생각해야합니다. 만약 A -> B -> C(또 다른 시스템 또는 데이터베이스 등) 이라면 B 역시 보호하고 싶은 시스템이 되는겁니다. 아마 A -> B -> C 형태로 호출되는 상황을 가정하신거 아닌가 생각되네요.


2. 백엔드 B에서 발생하는 CustomException을 카운팅하지 않으려면 백엔드 B에 ignoreExceptions 설정을 추가 이렇게 답변 주셨는데 그럼 결국 CircuitBreaker를 사용하려면 백엔드 A와 백엔드 B 둘 다 CircuitBreaker 설정을 추가해주는 게 맞는건가요? 저는 백엔드 A에만 설정을 추가해주면 된다고 생각을 했었어가지고요

-> 지금 하시려고 하는게 정확히 이건 것 같아서 제가 이상하게 생각되어 '백엔드 A'를 보호하려고 하는 것 아닌지 여쭤본겁니다. 말씀하신대로 백엔드 A를 보호하려면 백엔드 A에 CircuitBreaker 설정이 추가되어야합니다.

근데 백엔드 B에서 발생하는 CustomException을 이야기하셔서 어색해보였어요. 백엔드 B에서 발생하는 예외는 백엔드 B에서 처리되어야하는거고, 그걸 백엔드 A로 넘기려면 넘어가는건 '예외'가 아닙니다.

백엔드 B에서는 'HTTP Status Code'로 에러(5xx 에러가 적당하겠네요)를 응답으로 주면되고, 그게 문제가 되는 상황이라면 백엔드 A에서는 백엔드 B를 호출한 로직에서 해당 HTTP Status Code를 받아서 예외로 던진 후 해당 예외를 통해 CircuitBreaker의 상태를 변경하도록 설정하면 되겠죠.

 

혹시 질문에 대한 답이 되었을까요~?

추가적인 질문 있으면 질문 남겨주세요.

감사합니다. (_ _)

fbfbf1님의 프로필 이미지
fbfbf1
질문자

자세한 답변 감사드립니다. 제가 1번의 보호한다는 개념에 대해서 잘 이해하지 못 하고 있었네요

그리고 2번 질문을 좀 모호하게 했네요

 

답변이 정말 감사하게도 잘 해주셨는데 제 이해도가 많이 부족하네요
마지막으로 제가 이해한 게 맞는 지 한 번 확인차 질문드립니다.

제 처음 질문을 예시로 들어서 설명드리면

 

백엔드 A (서버 주소 192.168.0.1:8081)

image

image

백엔드 B (서버 주소 172.168.0.0:8082)

image

 

  1. A -> B로 호출을 할 때 서킷브레이커를 통해서 백엔드 A를 보호하고 싶으면 백엔드 A에 서킷브레이커 설정을 추가

  2. 백엔드 A에서 백엔드 B로 호출시 CustomBackendBException(Http Status Code 404)이 발생했을 때는 백엔드 A를 보호하려는 서킷 브레이커를 동작시키지 않고 싶습니다.


    이를 위해서 백엔드 B에서는 HttpStatusCode 404만 내려주면 되고 백엔드 A에서는 HttpStatusCode가 404면 ignore할 예외를 발생하면 되고 백엔드 A의 application.yml에 ignore할 예외를 추가하면 되는걸까요?

image

image

이준형(Foo)님의 프로필 이미지
이준형(Foo)
지식공유자

넵!!! 정확합니다!

fbfbf1님의 프로필 이미지
fbfbf1

작성한 질문수

질문하기