b

Spring Retry 1.3.1 본문

카테고리 없음

Spring Retry 1.3.1

dev.bistro 2021. 5. 25. 14:06

스프링부트 2.5 디펜던시 업그레이드 내용 중에서 Spring Retry 1.3이 보인다. 하지만 오래전부터 1.3 버전이 사용되고 있었으며,  가장 최신 버전인 retry 1.3.1 버전은  spring boot v2.4.2 에 이미 적용이 되어 있다.

retry 1.3.0 과 retry 1.3.1 을 비교해봐도 서킷 오픈에 관련된 버그 픽스를 제외하고 크게 변경 된 사항은 보이지 않는다. 
단지, RetryConfiguration 클래스가 InitializingBean  인터페이스를 추가로 확장 하면서, 처음부터 초기화 된다는 점 정도이다.
여기서 언급되는 RetryConfiguration 클래스는 @EnableRetry 어노테이션에서 사용된다 (즉 @EnableRety 가 active 되면 사용되는 컨피그)

RetryConfiguration 에서 AOP 를 이용해서 retry 정책을 활성화 한다. 그 중에서 

Set<Class<? extends Annotation>> retryableAnnotationTypes = new LinkedHashSet<Class<? extends Annotation>>(1);
retryableAnnotationTypes.add(Retryable.class);
this.pointcut = buildPointcut(retryableAnnotationTypes);

를 보면 Retryable annotation 이 포인트컷이 된다. 

@Service
public interface MyService {
    @Retryable(value = RuntimeException.class)
    void retryService(String sql);

}
이런식으로 사용 가능하다.


아래처럼 옵션을 적용하면  Backoff Policy 정책을 적용하여 최대 3번의 retry 를 수행한다.
@Retryable(value = RuntimeException.class, maxAttempts = 3,
    backoff = @Backoff(delay = 300, maxDelay = 500)
)

위에서 보여지는 BackOff 옵션은  300ms ~ 500ms 구간에서 최대 3번을 retry 하라는 옵션이다. 이 300 ~ 500 구간은 AnnotationAwareRetryOperationsInterceptor 의 getBackoffPolicy 를 참고하면 된다.
기본으로 실패 할 때마다 delay 만큼의 지연(sleep) 을 하고 재시도 한다. 여기에서 maxDelay 는 multiplier 라는 값을 함께 쓸 경우 의미가 있다. 실패할 때마다 delay 값을 multiplier 배 만큼 지연 시킬수가 있는데 최대 maxDelay는 넘기지 않도록 한다는 의미이다.

ExponentialBackOffPolicy policy = new ExponentialBackOffPolicy();
if (backoff.random()) {
	policy = new ExponentialRandomBackOffPolicy();
}
policy.setInitialInterval(min);
policy.setMultiplier(multiplier);
policy.setMaxInterval(max > min ? max : ExponentialBackOffPolicy.DEFAULT_MAX_INTERVAL);
if (this.sleeper != null) {
	policy.setSleeper(this.sleeper);
}

또한 backoff 에 random. = true 로 설정하면 RandomBackOffpolicy를 적용 할 수 있다. Sleep 의 정책은 문서에서 확인 가능

만약 RandomBackOffpolicy 가 아니라 Customize 를 하고 싶다면 SleepingBackOffPolicy<T extends SleepingBackOffPolicy<T>> 를 구현하고 RetryTemplate 에 setBackOffPolicy 으로 설정 해주면 된다.

 


Spring Retry 는  RetryOperations  인터페이스의 execute 메소드를 확장 할 수 있게 되어 있다. 이 인퍼페이스의 구현체로 RetryTemplate 를 제공하고 있고 SpringBatch 에서는 BatchRetryTemplate 이라는 클래스로 따로 구현해서 사용한다. 

이 RetryTemplate 은 다양한 곳에서 래핑되어 자동으로 retry 기능을 사용 할 수 있도록 하였다. SpringRetryCircuitBreakerConsulRetryBootstrapperConfigClientRetryBootstrapper 
SpringKafka 에서도 RetryTemplate 을 Factory에 주입하면 Retry 를 사용 할 수 있다. 링크

 

Comments