지수 백오프 (Exponential Backoff)
네트워크 상에서 일시적인 오류가 발생했을 때, 재시도 간격을 점진적으로 늘려가며 재시도를 수행하는 알고리즘.
주로 네트워크의 혼잡을 피하거나, 서버가 과부하 상태일 때 과도한 요청을 방지하기 위해 사용된다.
방법의 핵심은 "지수적으로" 대기시간을 늘리는 것
지수 백오프의 필요성
네트워크 통신 중 오류가 발생할 경우, 클라이언트는 보통 재시도를 통해 이를 해결하려고 한다. 하지만 모든 클라이언트가 동시에 재시도를 한다면, 서버는 한꺼번에 많은 요청을 처리해야 하므로 부하가 증가할 수 있다. 이러한 현상을 "재시도 폭주"라고 하며, 이를 방지하기 위해 지수 백오프를 사용한다.
하지만 이 방법도 한계가 있다. 어차피 동시에 요청이 몰린다면 똑같은 시간 간격으로 모든 재시도가 동일하게 몰릴 것이기 때문이다.
지연변이 (Jitter)
Jitter는 데이터 통신 용어로 사용할 때는 패킷 지연이 일정하지 않고, 수시로 변하면서 그 간격이 일정하지 않는 현상을 의미한다. Jitter 개념을 Retry에 이용하면 API를 요청하는 클라이언트 간의 동일한 재시도 시간 간격에 무작위성을 추가하여 서로 요청하는 시간대의 동시성?을 분산시킬 수 있다.
위 두 개념을 적용하면 지수로 증가하는 Backoff 시간에 일정 범위 안의 랜덤 대기 시간을 추가적으로 더하는 것으로 요청을 분산할 수 있다.
어디서 쓰나
- AWS SDK는 지수 백오프와 지터를 사용하여 연속 충돌을 방지한다 : https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.Errors.html#Programming.Errors.RetryAndBackoff
- Github 에서 exponentialBackoff 검색 시 109k의 코드가 검색 될 만큼 많이 사용되고, 관련 미들웨어도 있는것을 알 수 있다. https://github.com/search?q=exponentialBackoff&type=code
Reference
https://1yoouoo.tistory.com/37
https://jungseob86.tistory.com/12
'TIL' 카테고리의 다른 글
구글 코랩에서 Stable Diffusion WebUI API 호출하기 (2) | 2024.10.18 |
---|---|
2024.09.27 (6) | 2024.09.27 |
Vite, Webpack, Babel 관계 정리 (0) | 2024.05.24 |
자바스크립트 비동기 처리 알아보기 (3) | 2024.04.01 |
Windows 10 에어팟 2 케이스 충전 불가능 해결하기 (0) | 2024.03.29 |