말그대로 다시 시도하는겁니다. MSA 는 서버간 통신을 할 수 밖에없는데 저희는 Feign을 사용했습니다. 하지만 서버간 통신을 한다는것은 네트워크를 타야하는데 네트워크가 항상 좋을 순 없겠죠
위와같이 커넥션이 끊긴 상황에 직면하게 됩니다.
네트워크가 일시적으로 안된건지 서버가 다운된건지 해당 서버는 알 방법이 없죠
일시적으로 안된 상황을 위해 retry를 적용해보고자 합니다.
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을 발생시키냐고 할 수 있는데
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으로 구현 했습니다.