-
Retry Jitter카테고리 없음 2024. 8. 4. 15:46
Retry 메커니즘에서 'jitter'는 반복적인 재시도 간의 시간을 조정하기 위해 사용되는 기법이다. 이는 주로 네트워크 요청이나 분산 시스템에서 실패한 요청을 다시 시도할 때 사용된다. 기본적으로, 재시도 메커니즘은 일정한 지연 시간 후에 요청을 다시 시도한다. 그러나 모든 클라이언트가 동일한 간격으로 재시도하면, 서버에 일시에 많은 요청이 집중되어 과부하가 발생할 수 있다.
이를 방지하기 위해 'jitter'를 사용하여 지연 시간을 무작위로 변동시킨다. 이는 각 클라이언트의 재시도 시간을 약간 다르게 만들어 서버에 대한 요청이 분산되도록 한다.
import reactor.util.retry.Retry; import java.time.Duration; // 예시 WebClient 설정 WebClient client = WebClient.create(); client.get() .uri("http://test.com") .retrieve() .bodyToMono(String.class) .retryWhen(Retry.backoff(2, Duration.ofSeconds(1)).jitter(0.1)) ...
WebFlux에서 Retry.backoff(2, Duration.ofSeconds(1)).jitter(0.1)와 같이 설정된 부분에서 0.1은 Jitter를 추가하는 정도를 나타내는데 이 값은 백오프(backoff) 지연 시간에 대해 무작위 변동을 도입하는 비율이다.
- Retry.backoff(2, Duration.ofSeconds(1)): 최대 2번 재시도하며, 각 재시도 간에 1초의 지연 시간을 두는 백오프 전략을 설정한다.
- .jitter(0.1): 지연 시간에 대해 ±10%의 무작위 변동을 추가한다.
예)
1초 지연 시간을 기준으로 ±10%의 jitter를 적용하면, 지연 시간은 다음과 같이 변동될 수 있습다.
- 최소 지연 시간: 0.9초 (1초 - 10%)
- 최대 지연 시간: 1.1초 (1초 + 10%)
즉, 각 재시도 시 지연 시간은 0.9초에서 1.1초 사이의 랜덤한 값이 된다. 이렇게 하면 모든 클라이언트가 동일한 시간에 재시도하지 않도록 하여 서버에 과부하가 걸리는 것을 방지할 수 있다. 위 코드에서 retryWhen 연산자는 최대 2번 재시도하며, 각 재시도 간에는 0.9초에서 1.1초 사이의 랜덤한 지연 시간을 갖는다. 이렇게 하면 재시도 시점이 분산되어 서버에 과부하가 걸리는 것을 예방할 수 있다.