다시 시도

이 장에서는 Go Resty 요청의 다시 시도 메커니즘을 소개합니다.

Resty는 각 다시 시도 후 재시도 간격을 증가시키기 위해 백오프를 사용합니다.

사용 예시:

// Resty 클라이언트 생성
client := resty.New()

// 재시도 횟수 구성은 각 클라이언트에 대해 이루어짐
client.
    // 재시도를 활성화하려면 0이 아닌 재시도 횟수 설정
    SetRetryCount(3).
    // 초기 재시도 대기 시간을 사용자 정의할 수 있음
    // 기본 값은 100밀리초.
    SetRetryWaitTime(5 * time.Second).
    // MaxWaitTime도 재정의할 수 있음.
    // 기본 값은 2초.
    SetRetryMaxWaitTime(20 * time.Second).
    // RetryAfter를 설정하여 재시도 간의 대기 시간을 계산하는 콜백 함수를 지정합니다.
    // 기본값(nil)은 지수적으로 증가하는 백오프 시간과 지터를 사용합니다.
    SetRetryAfter(func(client *resty.Client, resp *resty.Response) (time.Duration, error) {
        return 0, errors.New("할당량 초과")
    })

기본적으로 resty는 실행 중에 0이 아닌 오류를 반환하는 요청을 다시 시도합니다. 따라서 위의 설정은 resty가 각 시도 후 지연을 증가시키면서 0이 아닌 오류를 반환하는 요청을 다시 시도하도록 만듭니다. 최대 3번의 재시도까지 이루어집니다.

또한 클라이언트에 대해 사용자 지정 재시도 조건을 제공할 수도 있습니다:

// Resty 클라이언트 생성
client := resty.New()

client.AddRetryCondition(
    // RetryConditionFunc 타입은 재시도 조건 함수에 사용됨
    // 입력: 0이 아닌 응답 또는 요청 실행 오류
    func(r *resty.Response, err error) bool {
        return r.StatusCode() == http.StatusTooManyRequests
    },
)

위의 예시는 429 Too Many Requests 상태 코드로 끝나는 요청을 resty가 다시 시도하도록 만듭니다. AddRetryCondition을 사용하여 조건을 지정하면 요청 프로세스 중 오류를 만났을 때의 기본 재시도 동작을 재정의하게 됩니다. 요청 프로세스 중 오류를 만났을 때의 기본 재시도 동작을 원한다면 다음과 같이 구성해야 합니다:

// Resty 클라이언트 생성
client := resty.New()

client.AddRetryCondition(
    func(r *resty.Response, err error) bool {
        // "err != nil"을 포함하여 요청 프로세스 중 오류를 만났을 때의 기본 재시도 동작을 시뮬레이션합니다.
        return err != nil || r.StatusCode() == http.StatusTooManyRequests
    },
)

여러 재시도 조건을 추가할 수 있습니다. 여러 조건이 지정된 경우 조건 중 하나라도 충족되면 재시도가 이루어집니다.

resty.Backoff(...)을 사용하여 임의의 재시도 시나리오를 구현할 수도 있습니다.