ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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초 사이의 랜덤한 지연 시간을 갖는다. 이렇게 하면 재시도 시점이 분산되어 서버에 과부하가 걸리는 것을 예방할 수 있다.

Designed by Tistory.