@Retryable으로 재시도 로직 구현하기

Alex·2024년 8월 25일

GenAI해커톤

목록 보기
3/9

처음에 재시도 로직을 구현하지 않았더니 readtimeout 로그 메시지가 떴다.

이러한 타임아웃은 서버로 요청을 보냈지만 일정 시간 동안 답변을 받지 못할 때 발생한다. 이러한 타임아웃이 필요한 이유는 리소스를 절약하기 위해서다. 서버는 여러 클라이언트와 동시에 연결을 생성하는데, 응답 시간이 길어지는 연결이 많으면 리소스가 모두 소진되어 장애로 이어질 수 있다.

예를 들어, 네트워크 문제로 서버가 여러 요청을 처리하지 못하면, 대기하는 요청이 많아지고 리소스가 모두 소진될 수 있다. 타임아웃을 사용하면 오래 걸리는 요청을 중단하고 다른 요청을 받을 수 있다.

Read Timeout

Read Timeout은 클라이언트에서 설정한 시간까지 서버에서 응답이 오지 않으면 발생한다. 클라이언트와 서버가 연결은 됐지만, 서버가 클라이언트의 요청을 정상적으로 처리 못 했을 때 일어난다. Read Timeout은 클라이언트에서 너무 많은 데이터를 조회했거나, 서버가 요청을 처리하는데 시간이 오래 걸려서 발생하는 경우가 많다.

maxAttempts: 최대 재시도 횟수
backoff: 재시도 사이 시간 간격 (ms)
include: 재시도 대상 Exception
include 는 value 와 동일한 속성이다.

디폴트 설정은 3번간 재시도가 일어나는 것이다.

@Recover어노테이션은 @Retryable가 실패할 때 시도할 행동이 정의된다. @Retryable에 정의된 예외가 세번 발생하면 recover가 붙은 메서드가 호출된다. @Retryable 어노테이션을 통한 재시도가 최종적으로 실패했을 경우 대체 응답을 반환할 수 있다

이러한 retry는 일시적인 장애를 대응하기 위해 사용한다. 즉, 복구가능한 경우에 사용하면 될듯하다. 일시적인 장애: 네트워크 순단, DB 장애 등
일시적인 장애가 아닌 경우, retry 를 통해 반복적인 장애를 전파하게 되면 서비스 신뢰도가 하락할 수 있다.
매 요청마다 뒷단 서버, 서비스에 반복된 요청을 시도하므로 서비스 부하가 증가할 수 있다.

profile
답을 찾기 위해서 노력하는 사람

0개의 댓글