다시 시도
이 장에서는 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(...)
을 사용하여 임의의 재시도 시나리오를 구현할 수도 있습니다.