@Retryable 사용을 위한 사전 세팅)// spring-retry
implementation ("org.springframework.retry:spring-retry")
@EnableRetry 어노테이션 추가@EnableRetry
@SpringBootApplication
public class Application {
....
}
@Transactional
@Retryable(
retryFor = {ObjectOptimisticLockingFailureException.class},
maxAttempts = 15,
backoff = @Backoff(50)
)
public Long addLike(Long postId) {
Post post = postRepository.findById(postId).orElseThrow();
post.addLike();
return post.getLikeCount();
}
@Retryable 어노테이션을 사용하여 재시도 설정이 가능
retryFor : 예외 발생 시에만 재시도를 수행하도록 제한하는 옵션maxAttempts : 어노테이션된 메서드에 대한 최대 횟수 시도를 지정 (Default = 3)backoff : 재시도 사이의 지연을 구현 @Backoff 어노테이션을 받아 밀리초 단위로 지연을 설정 가능maxAttempts) 설정 후, 최적의 재시도 사이 지연(backoff)을 설정하는 순서로 진행최대 재시도 횟수의 초기값을 1000으로 설정 후, 재시도 횟수를 2배씩 줄여나가다 데이터 누락율이 발생하면 재시도 횟수를 다음과 같이 설정. → (이전 설정한 재시도 횟수 + 이번 설정한 재시도 횟수) / 2
예시)
데이터 누락 없이 성공 시
1000 → 500 → 250 …
데이터 누락이 발생 시 (10에서 발생했다고 가정)
(20 + 10) / 2 -> 15
재시도 사이 지연 시간 초기값을 100으로 설정 후, 재시도 횟수 설정 과정과 동일하게 진행
예시)
데이터 누락 없이 성공 시
100 → 50 → 25 …
데이터 누락이 발생 시 (25에서 발생했다고 가정)
(50 + 25) / 2 -> 40 (37로 약 40이기 때문에)
| 재시도 횟수 | 데이터 누락율(%) |
|---|---|
| 1000 | 0 |
| 500 | 0 |
| 250 | 0 |
| 125 | 0 |
| 60 | 0 |
| 30 | 0 |
| 15 | 0 |
| 10 | 1 |
| 12 | 0.7 |
| 14 | 0.5 |
15를 최적의 재시도 횟수로 설정
| 재시도 횟수 | 데이터 누락율(%) |
|---|---|
| 100 | 0 |
| 50 | 0 |
| 25 | 3.9 |
| 30 | 1 |
| 40 | 0.7 |
| 45 | 0.6 |
50을 최적의 재시도 사이 지연으로 설정
https://xxeol.tistory.com/57
https://codesnapmag.hashnode.dev/spring-retryable-annotation