기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
재시도 동작
참고
설정 페이지의 레이아웃을 이해하거나, 이어지는 AWS SDK 및 도구 지원 표를 해석하는 데 도움이 되는 정보는 이 안내서의 설정 페이지의 이해에서 확인하세요.
재시도 동작에는 SDK가 AWS 서비스에 보내진 요청으로 인한 장애 복구를 시도하는 방법에 대한 설정이 포함됩니다.
다음을 사용하여 이 기능을 구성하십시오.
retry_mode- 공유 AWSconfig파일 설정AWS_RETRY_MODE- 환경 변수aws.retryMode- JVM 시스템 속성: Java/Kotlin만 해당-
SDK 또는 개발자 도구의 재시도 방법을 지정합니다.
기본값: 이 값은 SDK에 따라 달라집니다. SDK의 기본
retry_mode값은 SDK별 안내서를 확인하거나 SDK의 코드 베이스를 참고하세요.유효한 값:
-
standard- (권장) AWS SDK 전반에서 권장되는 재시도 규칙 세트입니다. 이 모드는 재시도 대상이 되는 표준 오류 집합을 포함하며, 가용성과 안정성을 극대화하기 위해 재시도 횟수를 자동으로 조정합니다. 이 모드는 멀티 테넌트 애플리케이션에서 사용하기에 안전합니다. 명시적으로max_attempts으로 구성되어 있지 않으면 이 모드의 기본 최대 시도 횟수는 3회입니다. -
adaptive- 표준 모드의 기능에 더해 클라이언트 측 자동 레이트 리미팅까지 포함하는 재시도 모드로, 특수한 사용 사례에만 적합합니다. 이 재시도 모드는 애플리케이션 테넌트를 철저히 분리하지 않는 한, 멀티 테넌트 애플리케이션에서는 권장되지 않습니다. 자세한 정보는 standard 및 adaptive 재시도 모드 중 선택을 참조하세요. 이 모드는 실험적이며, 향후 동작이 변경될 수 있습니다. -
legacy- (비권장) 사용자의 SDK에만 적용되는 설정으로, 해당 SDK 안내서 또는 SDK의 코드 베이스를 확인해야 합니다.
-
max_attempts- 공유 AWSconfig파일 설정AWS_MAX_ATTEMPTS- 환경 변수aws.maxAttempts- JVM 시스템 속성: Java/Kotlin만 해당-
요청에 대한 최대 시도 횟수를 지정합니다.
기본값: 이 값이 지정되지 않은 경우 기본값은
retry_mode설정 값에 따라 달라집니다.-
retry_mode이legacy인 경우— 사용자 SDK 고유의 기본값을 사용합니다(사용자 고유 SDK 설명서 또는max_attempts기본 SDK의 코드베이스를 확인하십시오). -
retry_mode이standard인 경우 — 세 번 시도합니다. -
retry_mode이adaptive인 경우 — 세 번 시도합니다.
유효한 값: 0보다 큰 숫자.
-
standard 및 adaptive 재시도 모드 중 선택
특별히 adaptive가 더 적합하다고 확신하지 않는 이상, standard 재시도 모드를 사용할 것을 권장합니다.
참고
adaptive 모드에서는 백엔드 서비스가 요청을 제한할 수 있는 범위에 따라 클라이언트를 풀링한다고 가정합니다. 이렇게 하지 않으면, 동일한 클라이언트를 여러 리소스에 사용 중일 때 특정 리소스에서 발생한 스로틀링이 관련 없는 리소스의 요청까지 지연시킬 수 있습니다.
| 표준 | 적응형 |
|---|---|
| 애플리케이션 사용 사례: 전체. | 애플리케이션 사용 사례:
|
| 중단 상황에서 SDK가 재시도하지 않도록 차단기를 지원합니다. | 중단 상황에서 SDK가 재시도하지 않도록 차단기를 지원합니다. |
| 실패 시 지터링된 지수 백오프를 사용합니다. | 지연 시간이 증가할 가능성과 맞바꾸는 대신, 실패한 요청 수를 최소화하기 위해 동적 백오프 지속 시간을 사용합니다. |
| 첫 번째 요청 시도에는 지연을 적용하지 않고, 재시도에만 지연을 적용합니다. | 초기 요청 시도에도 스로틀링하거나 지연을 적용할 수 있습니다. |
adaptive 모드를 사용하기로 선택한 경우, 애플리케이션은 스로틀링이 발생할 수 있는 각 리소스별로 클라이언트를 구성해야 합니다. 이 경우 리소스는 단순히 각 AWS 서비스 단위로만 생각하는 것보다 더 세분화된 개념입니다. AWS 서비스는 요청을 스로틀링하기 위해 추가적인 차원을 사용할 수 있습니다. Amazon DynamoDB 서비스를 예로 들어 보겠습니다. DynamoDB는 AWS 리전 및 액세스 중인 테이블을 사용하여 요청을 스로틀링합니다. 이는 코드에서 액세스하는 테이블 중 하나가 다른 테이블보다 더 많이 스로틀링될 수 있다는 뜻입니다. 코드에서 모든 테이블에 동일한 클라이언트를 사용하고 있고, 그중 하나의 테이블이 스로틀링되면, 적응형 재시도 모드는 모든 테이블에 대한 요청 속도를 낮추게 됩니다. 코드는 리전과 테이블의 각 조합마다 하나의 클라이언트를 사용하도록 설계해야 합니다. adaptive 모드를 사용할 때 예상치 못한 지연이 발생한다면, 사용 중인 서비스의 AWS 문서 안내서를 참고하세요.
재시도 모드 구현 세부 정보
AWS SDK는 토큰 버킷adaptive 재시도 모드의 경우)를 결정합니다. SDK는 재시도 토큰 버킷과 요청 속도 토큰 버킷이라는 두 개의 토큰 버킷을 사용합니다.
-
재시도 토큰 버킷은 중단 시 업스트림 및 다운스트림 서비스를 보호하기 위해 SDK가 재시도를 일시적으로 비활성화해야 하는지 여부를 결정하는 데 사용됩니다. 재시도를 시도하기 전에 버킷에서 토큰을 획득하고, 요청이 성공하면 토큰이 버킷으로 반환됩니다. 재시도를 시도할 때 버킷이 비어 있는 경우 SDK가 요청을 재시도하지 않습니다.
-
요청 속도 토큰 버킷은
adaptive재시도 모드에서만 사용되며, 요청을 전송할 속도를 결정하는 데 활용됩니다. 요청을 보내기 전에 버킷에서 토큰을 가져오며, 서비스에서 반환되는 스로틀링 응답을 기반으로 동적으로 결정된 속도에 따라 토큰이 버킷에 반환됩니다.
다음은 standard 모드와 adaptive 모드 모두에 대한 고급 의사코드입니다.
MakeSDKRequest() { attempts = 0 loop { GetSendToken() response = SendHTTPRequest() RequestBookkeeping(response) if not Retryable(response) return response attempts += 1 if attempts >= MAX_ATTEMPTS: return response if not HasRetryQuota(response) return response delay = ExponentialBackoff(attempts) sleep(delay) } }
다음은 의사코드에 사용되는 구성 요소에 대한 자세한 내용입니다.
GetSendToken:
이 단계는 adaptive 재시도 모드에서만 사용됩니다. 이 단계에서는 요청 속도 토큰 버킷에서 토큰을 가져옵니다. 토큰을 사용할 수 없는 경우 토큰을 사용할 수 있을 때까지 기다립니다. SDK에는 대기 대신 요청을 즉시 실패하도록 설정할 수 있는 구성 옵션이 제공될 수도 있습니다. 버킷의 토큰은 클라이언트가 받은 스로틀링 응답 수에 따라 동적으로 결정되는 속도로 다시 채워집니다.
SendHTTPRequest:
이 단계에서는 AWS로 요청을 보냅니다. 대부분의 AWS SDK는 HTTP 요청을 보낼 때 기존 연결을 재사용하기 위해 연결 풀을 사용하는 HTTP 라이브러리를 사용합니다. 일반적으로 요청이 스로틀링 오류로 인해 실패한 경우에는 연결이 재사용되지만, 일시적 오류로 인해 실패한 경우에는 연결이 재사용되지 않습니다.
RequestBookkeeping:
요청이 성공하면 토큰이 토큰 버킷에 추가됩니다. adaptive 재시도 모드에서만, 요청 속도 토큰 버킷의 충전 속도는 수신한 응답 유형에 따라 업데이트됩니다.
Retryable:
이 단계에서는 다음을 기반으로 응답을 재시도할 수 있는지 여부를 결정합니다.
-
HTTP 상태 코드.
-
서비스에서 반환된 오류 코드입니다.
-
연결 오류로, 서비스로부터 HTTP 응답을 받지 못한 SDK에서 수신한 모든 오류로 정의됩니다.
일시적 오류(HTTP 상태 코드 400, 408, 500, 502, 503, 504)와 조절 오류(HTTP 상태 코드 400, 403, 429, 502, 503, 509)는 모두 재시도될 수 있습니다. SDK 재시도 동작은 서비스의 오류 코드 또는 서비스의 기타 데이터와 조합하여 결정됩니다.
MAX_ATTEMPTS:
기본 최대 시도 횟수는 max_attempts 설정으로 재정의되지 않는 한 retry_mode 설정에 의해 결정됩니다.
HasRetryQuota
이 단계에서는 재시도 토큰 버킷에서 토큰을 가져옵니다. 재시도 토큰 버킷이 비어 있으면 요청이 재시도되지 않습니다.
ExponentialBackoff
재시도할 수 있는 오류의 경우 잘린 지수 백오프를 사용하여 재시도 지연을 계산합니다. SDK는 지터가 있는 잘린 이진 지수 백오프를 사용합니다. 다음 알고리즘은 요청에 대한 응답의 절전 시간(초)이 어떻게 정의되는지 보여줍니다. i
seconds_to_sleep_i = min(b*r^i, MAX_BACKOFF)
위 알고리즘에는 다음 값이 적용됩니다.
b = random number within the range of: 0 <= b <= 1
r = 2
대부분의 SDK용 MAX_BACKOFF = 20 seconds. 사용자 특정 SDK 가이드 또는 소스 코드를 참조하여 확인합니다.
AWS SDK 및 도구 지원
다음 SDK는 이 주제에서 설명하는 기능 및 설정을 지원합니다. 모든 일부 예외가 기록됩니다. 모든 JVM 시스템 속성 설정은 AWS SDK for Java 및 AWS SDK for Kotlin에서만 지원됩니다.
| SDK | 지원 | 참고 또는 추가 정보 |
|---|---|---|
| AWS CLI v2 | 예 | |
| SDK for C++ | 예 | |
| SDK for Go V2 (1.x) |
예 | |
| SDK for Go 1.x (V1) | 아니요 | |
| SDK for Java 2.x | 예 | |
| SDK for Java 1.x | 예 | JVM 시스템 속성: aws.maxAttempts 대신 com.amazonaws.sdk.maxAttempts를 사용하고, aws.retryMode 대신 com.amazonaws.sdk.retryMode를 사용합니다. |
| SDK for JavaScript 3.x | 예 | |
| SDK for JavaScript 2.x | 아니요 | 최대 재시도 횟수, 지터가 있는 지수 백오프, 재시도 백오프를 위한 사용자 지정 방법 옵션을 지원합니다. |
| SDK for Kotlin | 예 | |
| SDK for .NET 4.x | 예 | |
| SDK for .NET 3.x | 예 | |
| SDK for PHP 3.x | 예 | |
| SDK for Python (Boto3) |
예 | |
| SDK for Ruby 3.x | 예 | |
| SDK for Rust | 예 | |
| SDK for Swift | 예 | |
| Tools for PowerShell V5 | 예 | |
| Tools for PowerShell V4 | 예 |