지수 백오프란 무엇인가
지수 백오프는 네트워크 요청이나 API 호출이 실패했을 때, 일정한 간격이 아니라 실패할 때마다 대기 시간을 지수적으로 늘려가며 재시도하는 전략입니다. 예를 들어 첫 번째 재시도는 1초 후, 두 번째는 2초 후, 세 번째는 4초 후, 네 번째는 8초 후와 같이 대기 시간이 두 배씩 증가합니다.
이는 마치 친구에게 전화를 걸었는데 받지 않을 때, 바로바로 계속 거는 대신 처음엔 1분 후, 그다음엔 2분 후, 4분 후로 점점 간격을 늘려서 다시 거는 것과 비슷합니다. 상대방이 바쁜 상황일 가능성이 높다면 무작정 자주 거는 것보다 여유를 주는 편이 효율적이기 때문입니다.
동작 원리와 예시
기본 공식은 대기시간 = 기본지연 * 2^재시도횟수 형태로 계산됩니다. 여기에 실무에서는 지터(Jitter)라는 개념을 추가로 적용하는 경우가 많습니다. 지터는 계산된 대기 시간에 약간의 무작위 값을 더하거나 빼는 것으로, 여러 클라이언트가 동시에 같은 타이밍에 재시도를 몰아서 보내는 상황을 방지합니다.
- 1차 실패: 1초 대기 후 재시도
- 2차 실패: 2초 대기 후 재시도
- 3차 실패: 4초 대기 후 재시도
- 4차 실패: 8초 대기 후 재시도 (여기에 지터로 ±0.5초 정도 랜덤 추가)
보통 최대 재시도 횟수나 최대 대기 시간의 상한선을 함께 설정해서, 무한정 대기 시간이 늘어나지 않도록 제한합니다.
실무에서 왜 사용하는가
서버가 일시적으로 과부하 상태이거나 네트워크가 불안정한 상황에서, 클라이언트들이 실패 즉시 계속 재시도를 반복하면 오히려 서버에 더 큰 부하를 줘서 장애를 악화시킬 수 있습니다. 이를 흔히 ‘재시도 폭풍(Retry Storm)’이라고 부릅니다. 지수 백오프는 이런 상황에서 서버가 회복할 시간을 벌어주는 역할을 합니다.
실제로 AWS SDK, Google Cloud API, HTTP 클라이언트 라이브러리 등 많은 곳에서 기본 재시도 정책으로 지수 백오프와 지터를 함께 채택하고 있습니다. 분산 시스템에서 일시적 오류(timeout, 503 에러 등)를 다룰 때 이 전략은 안정성을 높이는 핵심적인 방법으로 널리 쓰입니다.