본문 바로가기
[개발] Info/용어

지수적 백오프(Exponential Backoff)

by Devsong26 2024. 10. 8.

지수적 백오프(Exponential Backoff)는 서버에 과도한 요청을 하지 않도록 제어하는 재시도 전략 중 하나입니다. 주로 네트워크 통신, API 호출, 분산 시스템에서 일시적인 오류가 발생했을 때, 동일한 요청을 일정 시간 간격을 두고 재시도하는 방법입니다. 이때, 재시도할 때마다 대기 시간이 지수적으로 증가합니다. 즉, 첫 번째 재시도 후에는 짧은 대기 시간, 두 번째 재시도 후에는 더 긴 대기 시간이 설정되며, 시간이 갈수록 대기 시간이 두 배씩 늘어납니다.

지수적 백오프의 핵심 개념

  1. 지수적 증가: 각 재시도 간의 대기 시간이 이전 대기 시간보다 지수적으로 늘어납니다. 예를 들어, 첫 번째 재시도는 1초 후, 두 번째는 2초 후, 세 번째는 4초 후, 네 번째는 8초 후 등으로 점점 더 오래 대기하게 됩니다.
  2. 최대 재시도 횟수: 일반적으로 일정 횟수 이상 재시도를 하지 않도록 최대 재시도 횟수를 설정합니다. 이를 통해 영구적으로 재시도를 반복하는 상황을 방지할 수 있습니다.
  3. 재시도 후 성공 가능성 증가: 지수적 백오프는 서버의 부하가 완화되거나 일시적인 문제(네트워크 오류 등)가 해결될 시간을 주어, 각 재시도 시 요청이 성공할 가능성을 높입니다.
  4. 랜덤 지수적 백오프 (Randomized Exponential Backoff): 동일한 대기 시간을 사용하는 여러 클라이언트가 동시에 재시도하는 것을 방지하기 위해, 대기 시간을 랜덤한 값으로 조정할 수 있습니다. 이 방식은 동시 재시도 폭주를 피하는 데 도움이 됩니다.

지수적 백오프 동작 방식

  1. 첫 번째 시도: 요청을 보냄 (예: 서버에서 500 오류 발생)
  2. 대기 시간: 1초
  3. 두 번째 시도: 요청을 다시 보냄 (실패)
  4. 대기 시간: 2초
  5. 세 번째 시도: 요청을 다시 보냄 (실패)
  6. 대기 시간: 4초
  7. 네 번째 시도: 요청을 다시 보냄 (성공)

이렇게 하면 서버에 무리한 재시도를 하지 않고, 일시적인 문제로 인한 실패 시 클라이언트가 너무 빨리 반복적으로 요청을 보내는 문제를 방지할 수 있습니다.

지수적 백오프의 장점

  • 서버 부하 감소: 재시도 대기 시간이 점점 길어지므로 서버가 처리할 수 있는 여유를 주어 부하를 완화할 수 있습니다.
  • 효율적인 오류 처리: 서버가 일시적으로 다운되었을 때도 클라이언트가 적절한 시간 후에 재시도하므로 성공 가능성이 높아집니다.
  • 충돌 방지: 여러 클라이언트가 동일한 시간에 재시도하는 것을 방지하여 충돌이 발생하는 상황을 줄일 수 있습니다.

지수적 백오프 사용 예시

지수적 백오프는 다양한 시스템에서 사용되며, 주로 API 요청 또는 네트워크 호출에서 일시적인 실패를 다룰 때 적용됩니다. 예를 들어:

  • Google Cloud API: 요청 한도를 초과한 경우 지수적 백오프를 사용해 재시도하는 방식이 권장됩니다.
  • Amazon AWS SDK: AWS 서비스의 클라이언트 라이브러리에서는 기본적으로 지수적 백오프가 구현되어 있습니다.
  • 데이터베이스 연결: DB 서버가 일시적으로 응답하지 않거나 네트워크 문제가 발생했을 때 재시도하는 데 사용됩니다.

코드 예시

아래는 지수적 백오프를 적용한 Java 코드 예시입니다:

public class ExponentialBackoffExample {

    private static final int MAX_RETRIES = 5; // 최대 재시도 횟수

    public static void main(String[] args) {
        int retryCount = 0;
        boolean success = false;

        while (retryCount < MAX_RETRIES && !success) {
            try {
                // API 호출 또는 네트워크 요청
                makeRequest();
                success = true; // 요청 성공 시 종료
            } catch (Exception e) {
                retryCount++;
                if (retryCount < MAX_RETRIES) {
                    // 지수적 백오프에 따른 대기 시간 계산
                    long waitTime = (long) Math.pow(2, retryCount) * 1000; // 1, 2, 4, 8, 16초 등 증가
                    System.out.println("재시도 중... 대기 시간: " + waitTime + "ms");
                    try {
                        Thread.sleep(waitTime);
                    } catch (InterruptedException ie) {
                        Thread.currentThread().interrupt();
                    }
                } else {
                    System.out.println("최대 재시도 횟수를 초과했습니다.");
                }
            }
        }
    }

    private static void makeRequest() throws Exception {
        // 요청을 처리하는 로직
        throw new Exception("임시 오류 발생");
    }
}

 

이 코드는 API 호출에서 오류가 발생하면 지수적으로 대기 시간을 늘려가며 재시도하는 방식입니다.

'[개발] Info > 용어' 카테고리의 다른 글

멀티 모듈(Multi-Module)  (0) 2024.08.09
Software versioning  (0) 2024.07.28
Hashicorp Vault  (0) 2024.07.26
워커 러너 패턴  (0) 2024.07.21
보일러 플레이트(boiler plate)  (0) 2024.07.21