일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- avo
- enablekafkastreams
- spring-batch
- Kafka
- springboot
- kafkastream
- kafka interactive query
- schema registry
- kafkastreams
- play framework
- Slick
- Logstash
- aws
- spring-cloud-stream
- reactive
- Elasticsearch
- scala 2.10
- RabbitMQ
- confluent
- scala
- coursera
- gradle
- spring-kafka
- 카프카
- 플레이 프레임워크
- Spring
- statestore
- Elk
- 한빛미디어
- kafka streams
- Today
- Total
b
Spring Retry 1.3.1 본문
스프링부트 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 기능을 사용 할 수 있도록 하였다. SpringRetryCircuitBreaker, ConsulRetryBootstrapper, ConfigClientRetryBootstrapper
SpringKafka 에서도 RetryTemplate 을 Factory에 주입하면 Retry 를 사용 할 수 있다. 링크