MSA 서비스를 개발하면서 외부 API를 호출하는 일이 많은데, 외부 API 호출에 실패할 경우 재시도를 적용할 때, 사용했던 2가지 방법에 대해 기록.
큐에 Delay 적용하여 재시도 횟수 별로 시간 차를 두어 호출하게 한다.
정보 유실이 일어나면 안되는 메시지나 빠르게 정보를 취합하는 것 보다 확실한 이벤트 전달이 중요할 때.
Ex) 외부 서비스 웹 훅 이벤트 연동 등,,
장점
큐에 저장되기 때문에 서버 재시작 등으로 정보가 유실되지 않는다.⭐
메인 서버 트랜잭션과 분리되어 있기 때문에 서버 부하를 최소화 한다.
큐 시스템 자체 설정에 따라 대용량 트래픽에 대응이 가능하다.
단점
기능 구현에 복잡성이 있다.
큐 시스템 운영 및 모니터링이 필요하다.
RetryConfig 에 Duration 규칙을 두어 재시도 횟수별로 시간 차를 두었다.
Resilience4j의 Retry를 사용할 경우 시간 차를 길게 둘 수 없고 너무 많은 호출에 적용하면 서버 부하가 예상된다.
또한 데이터를 생성하거나 수정하는 호출에 경우 멱등성이 회손 될 가능성이 있다.
그렇기 때문에 호출 빈도수가 높고, 서비스 노출성이 높은 외부 API 조회성 호출에 적용하였다.
이 경우 서버 재시작으로 정보가 유실 되어도 Client 단에서 재접속시 정보를 획득 할 수 있고, 단기간 내에 정보 취득이 필요하다고 판단하여 이 방법을 선택하였다.
EX) 서비스에 필요한 정보를 외부 API를 통해 가져오는 건
장점
구현이 간단하다.
JVM 내에서 처리 가능하다.
단점
재시도 대기 중인 요청은 Thread와 자원을 점유하기 때문에 서버 메모리에 부담이 된다.
서버 재시작 등의 이슈가 있을 시 재시도 정보가 유실 될 수 있다.
텀이 긴 재시도는 불가능 하다.