Exponential Backoff

mseo39·2024년 7월 17일
0

TIL

목록 보기
4/4
post-thumbnail

socket 재시도에 대해서 보다가 재시도를 실패하면 재시도 간격을 지수적으로 증가하는 것을 봤다. 처음에는 왜 지수적으로 증가하지? 하고 찾아봤는데 이를 지수 백오프(Exponential Backoff)라고 부른다고 한다.

지수 백오프(Exponential Backoff)란?

지수 백오프는 네트워크 상에서 일시적인 오류가 발생했을 때, 재시도 간격을 점진적으로 늘려가며 재시도를 수행하는 알고리즘이다. 이 방법은 주로 네트워크의 혼잡을 피하거나, 서버가 과부하 상태일 때 과도한 요청을 방지하기 위해 사용된다.

💡 지수적으로 증가하기 때문에 최대 재시도 간격을 설정하여 무한 증가를 방지해줘야 함

❓ 오류가 발생했을 때 연결하고 있던 클라이언트들의 재시도가 동시에 몰린다면 똑같은 시간 간격으로 모든 재시도가 동일하게 몰린다는 문제가 있다

→ 그래서 사용하는 것이 jitter

Jitter란?

지수백오프에 일정범위의 랜덤한 값을 같이 사용하는 것이다. Jitter를 추가함으로써 네트워크 과부하를 줄이고, 재시도가 더 고르게 분포되도록 한다. 종류는 아래와 같이 3가지가 있다.

1. Full Jitter

: 재시도 간격을 0과 현재 백오프 간격 사이의 무작위 값으로 설정한다. 간격이 완전히 무작위이므로 충돌 가능성이 매우 낮다는 특징을 가진다

delay = min(base_delay * (2 ** retries), max_delay)
jitter = random.uniform(0, delay)
time.sleep(jitter)
retries += 1

2. Equal Jitter

: 재시도 간격의 절반을 기준으로 무작위 값을 추가한다. 간격이 더 균일하게 분포되며, 너무 짧거나 너무 긴 간격을 피한다는 특징을 가진다

delay = min(base_delay * (2 ** retries), max_delay)
jitter = delay / 2 + random.uniform(0, delay / 2)
time.sleep(jitter)
retries += 1

3. Decorrelated Jitter

: 이전 재시도 간격과 무관하게 완전히 새로운 간격을 설정하여, 예측 불가능성을 극대화하고자 할 때 사용한다는 특징을 가진다.

delay = min(base_delay + random.uniform(0, delay * 3), max_delay)
time.sleep(delay)

더 자세하게 알고싶다면 지수백오프 with jitter 참고자료를 추천한다

참고자료

profile
하루하루 성실하게

0개의 댓글