네트워크 통신 등에서 재시도를 할 때 사용되는 알고리즘으로, 일정한 지연 시간 간격을 기반으로 재시도를 수행하는 방식이다. 이 알고리즘은 네트워크 요청이 실패할 경우 네트워크 상태를 고려하여 일시적인 문제를 해결하고, 과도한 리소스 사용을 방지하는데 유용하다.
지수 백오프 알고리즘은 재시도를 수행하는 동안 재시도 간격을 점차 증가시키는 방식으로 동작한다. 보통 최초 재시도는 비교적 빠른 간격으로 수행하고, 만약 재시도가 여전히 실패하면 재시도 간격을 지수적으로 증가시켜 더 큰 간격으로 재시도를 수행하게 한다. 이러한 방식으로 네트워크 요청이 성공할 때까지 반복적으로 재시도한다.
지수 백오프 알고리즘은 주로 네트워크 통신에서 재시도가 필요한 상황에서 사용된다. 예를 들어, 서버에 요청을 보내고 응답을 기다리는데 일시적으로 네트워크 연결이 불안정한 경우나 서버가 일시적으로 과부하 상태인 경우 등에 사용된다. 이러한 상황에서 일정한 간격으로 재시도를 수행하면 네트워크 리소스를 과도하게 사용하거나 서버에 더 큰 부하를 주는 문제를 방지할 수 있다.
아래는 웹소켓을 통해 데이터를 주고 받는 과정에서, 연결 통신이 끊어지면 재시도 하는 로직이다. 이때 재연결의 시간 간격을 지수백오프 형태로 지정해주면 좋다.
export const exponentialBackoff = (attempt: number, jitterFactor: number = 0.3, maxDelay = 30000): number => {
const delay = Math.min(Math.pow(2, attempt), maxDelay)
const jitter = Math.random() * Math.min(jitterFactor * delay, delay * 0.9)
const finalDelay = Math.max(delay - jitter, 0.1) * 1000
return finalDelay
}
그런데 코드를 확인해보면 jitter
라는 랜덤성 값이 있는것을 볼 수 있다.
만약, 서버에 이슈가 생겨 연결이 끊어졌을 경우 클라이언트는 작성된 재연결 로직에 의해 연결을 다시 시도할 것이다.
이때 사용자가 1000명이라면, 1000개의 리소스가 동시에 처리되어야할 문제가 생기고, 이는 서버의 과부하를 야기한다. 때문에, 이처럼 랜덤성을 부여하면 주로 동시성 문제와 서버 과부하를 방지하는 효과를 준다.