기술 · 출처 기반 답변
지수 백오프(Exponential Backoff) 재시도란?
지수 백오프 재시도는 실패한 작업을 연속으로 재시도할 때 재시도 사이의 지연 시간이 지수적으로 늘어나는 오류 처리 전략입니다. 고정된 간격으로 재시도하는 대신, 실패할 때마다 더 오래 기다려 수신 서버가 혼잡이나 일시적인 장애에서 회복할 시간을 줍니다.
동작 원리
이 과정은 1초 같은 초기 대기 시간으로 시작합니다. 첫 번째 재시도가 실패하면 대기 시간에 일정한 배수(보통 2)를 곱합니다. 두 번째 재시도는 2초 뒤, 세 번째는 4초 뒤, 네 번째는 8초 뒤에 이루어지는 식입니다. 이 등비수열은 최대 지연 시간 임계값이나 최대 시도 횟수에 도달할 때까지 이어지며, 그 시점에 메시지는 영구 실패로 표시됩니다.
발신자에게 중요한 이유
이 방식을 사용하면 발신자가 의도치 않게 수신 메일 서버에 서비스 거부 공격을 하는 일을 막을 수 있습니다. 수천 개의 메시지가 동시에 실패해 모두 10초마다 재시도하면 발생하는 트래픽 급증으로 수신 서버가 계속 오프라인 상태가 될 수 있습니다. 재시도를 분산시키면 발신자는 더 좋은 평판을 유지하고, 메시지가 폐기되기 전에 일시적인 4xx SMTP 오류가 해소될 가능성을 높일 수 있습니다.
운영상 고려 사항
이 전략에 꼭 필요한 요소가 지터(jitter)로, 지연 시간에 작은 무작위 값을 더합니다. 지터가 없으면 같은 시점에 실패한 여러 요청이 동기화된 파동으로 재시도되어 트래픽이 급증합니다. 지터를 적용하면 재시도가 시간 구간 전체에 고르게 분산되어 인프라의 부담이 더욱 줄어듭니다.
흔한 구현 실수
개발자는 최대 재시도 횟수나 지연 시간의 상한을 설정하는 것을 자주 잊습니다. 상한이 없으면 대기 시간이 몇 시간 또는 며칠까지 늘어나 트랜잭션 이메일에 용납할 수 없는 지연이 생깁니다. 또 다른 실수는 5xx 영구 실패를 재시도 대상으로 취급하는 것입니다. 지수 백오프는 속도 제한이나 일시적인 그레이리스팅 같은 4xx 일시적 오류에만 적용해야 합니다.
구체적인 예시
API로 트랜잭션 이메일을 보내는 경우를 생각해 보세요. 1번째 시도가 421 server busy 오류로 실패하면 시스템은 2초를 기다립니다. 2번째 시도가 실패하면 4초를 기다립니다. 3번째 시도가 실패하면 8초를 기다립니다. 4번째 시도 시점에는 수신 서버가 큐를 비웠을 가능성이 높아 이메일이 수락됩니다. SendHQ는 https://sendhq.cc/tools에서 이메일 인프라 효율을 관리하는 데 도움이 되는 무료 도구를 제공합니다.
팀에서 자주 묻는 질문
고정 백오프와 지수 백오프는 무엇이 다른가요?
고정 백오프는 실패 횟수와 관계없이 X초마다 재시도합니다. 지수 백오프는 실패할 때마다 간격을 늘려 대상 서버의 부하를 줄입니다.
재시도는 언제 중단해야 하나요?
5xx 영구 실패가 반환되거나, 최대 시도 횟수에 도달하거나, 최대 지연 상한에 도달하면 재시도를 중단해야 합니다.
지터가 지수적 증가에 영향을 주나요?
아니요. 지터는 계산된 지수 지연 시간에 무작위 오프셋을 더해, 동시에 발생한 여러 요청 사이에서 재시도가 동기화되어 급증하는 것을 막습니다.
1차 출처
- RFC 5321: 단순 메일 전송 프로토콜(SMTP) — RFC Editor
- M3AAWG 모범 사례(Best Common Practices) — M3AAWG