Troubleshoot) retry 전략으로 보험들기

박우영·2023년 9월 8일
0

트러블 슈팅

목록 보기
18/19

retry?

말그대로 다시 시도하는겁니다. MSA 는 서버간 통신을 할 수 밖에없는데 저희는 Feign을 사용했습니다. 하지만 서버간 통신을 한다는것은 네트워크를 타야하는데 네트워크가 항상 좋을 순 없겠죠

위와같이 커넥션이 끊긴 상황에 직면하게 됩니다.

네트워크가 일시적으로 안된건지 서버가 다운된건지 해당 서버는 알 방법이 없죠
일시적으로 안된 상황을 위해 retry를 적용해보고자 합니다.

How?

ErrorDecoder

public class Custom5xxErrorDecoder implements ErrorDecoder {
    @Override
    public Exception decode(String methodKey, Response response) {
        FeignException exception = errorStatus(methodKey, response);
        int status = response.status();
        if (status >= 500) {
            return new RetryableException(
                    response.status(),
                    exception.getMessage(),
                    response.request().httpMethod(),
                    exception,
                    null,
                    response.request());
        }
        return exception;
    }
}

ErrorDecode 를 상속받아 500 상황일때 RetryableException 을 리턴합니다.

retry를 하라했더니 왜 exception을 발생시키냐고 할 수 있는데

retry 구현

public class NaiveRetryer implements Retryer {
    @Override
    public void continueOrPropagate(RetryableException e) {
        try {
            Thread.sleep(1000L);
        } catch (InterruptedException ex) {
            Thread.currentThread().interrupt();
            throw e;
        }
    }

    @Override
    public Retryer clone() {
        return new NaiveRetryer();
    }
}

다음 과 같이 RetryableException 을 파라미터로 받는 Retryer를 구현하면 1초 뒤에 다시 retry 하는 로직 입니다.

sleep으로 쓰레드를 조절하면 좋지않다는것은 알지만 지금은 단순하게 retry 전략으로 해당 네트워크 Issue를 해결하기 위한 목적이기때문에 sleep으로 구현 했습니다.

Reference

baeldung

0개의 댓글