AWS SDK for Java 2.x에서 재시도 동작 구성 - AWS SDK for Java 2.x

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

AWS SDK for Java 2.x에서 재시도 동작 구성

AWS 서비스에 대한 호출은 예기치 않은 이유로 가끔 실패할 수 있습니다. 호출을 재시도하면 스로틀링(속도 초과) 또는 일시적 오류와 같은 특정 오류가 성공할 수 있습니다. AWS SDK for Java 2.x에는 이러한 오류를 감지하고 모든 클라이언트에 대해 기본적으로 사용 설정된 호출을 자동으로 재시도하는 메커니즘이 내장되어 있습니다.

이 페이지에서는 작동 방식, 고유한 모드를 구성하는 방법, 재시도 동작을 사용자 지정하는 방법을 설명합니다.

재시도 전략

재시도 전략은 SDK에서 재시도를 구현하는 데 사용되는 메커니즘입니다. 각 SDK 클라이언트에는 구축 시 만든 재시도 전략이 있으며, 클라이언트가 구축된 후에는 수정할 수 없습니다.

재시도 전략의 책임은 다음과 같습니다.

  • 예외를 재시도 가능 여부로 분류합니다.

  • 다음 시도 전에 대기하도록 제안된 지연을 계산합니다.

  • 많은 비율의 요청이 실패하고 재시도가 실패할 때 재시도를 중지하는 메커니즘을 제공하는 토큰 버킷을 유지 관리합니다.

참고

SDK 버전 2.26.0으로 재시도 전략을 릴리스하기 전에 재시도 정책은 SDK에 재시도 메커니즘을 제공했습니다. 재시도 정책 API는 software.amazon.awssdk.core.retry 패키지의 주요 RetryPolicy 클래스로 구성된 반면, software.amazon.awssdk.retries 패키지에는 재시도 전략 API 요소가 포함되어 있습니다.

재시도 전략 API는 SDK의 주요 구성 요소의 인터페이스와 동작을 통합하기 위한 AWS의 포괄적 노력의 일환으로 도입되었습니다.

SDK for Java 2.x에는 표준, 레거시 및 적응형이라는 3가지 재시도 전략이 내장되어 있습니다. 3가지 재시도 전략 모두 재시도 가능한 예외 집합에 대해 재시도하도록 미리 구성되어 있습니다. 재시도 가능한 오류의 예로는 소켓 제한 시간, 서비스 측 스로틀링, 동시성 또는 낙관적 잠금 실패, 일시적인 서비스 오류가 있습니다.

표준 재시도 전략

표준 재시도 전략은 일반적인 사용 사례에 권장되는 RetryStrategy 구현입니다. AdaptiveRetryStrategy와 달리 표준 전략은 일반적으로 모든 재시도 사용 사례에서 유용합니다.

기본적으로 표준 재시도 전략은 다음을 수행합니다.

  • 구축 시 구성된 조건을 재시도합니다. StandardRetryStrategy.Builder#retryOnException를 사용하여 이 값을 조정할 수 있습니다.

  • 총 3회 시도에서 2회 재시도합니다. StandardRetryStrategy.Builder#maxAttempts(int)를 사용하여 이 값을 조정할 수 있습니다.

  • 스로틀링이 없는 예외의 경우 기본 지연 시간이 100밀리초이고 최대 지연 시간이 20초인 BackoffStrategy#exponentialDelay 백오프 전략을 사용합니다. StandardRetryStrategy.Builder#backoffStrategy를 사용하여 이 값을 조정할 수 있습니다.

  • 스로틀링 예외의 경우 기본 지연 시간이 1초이고 최대 지연 시간이 20초인 BackoffStrategy#exponentialDelay 백오프 전략을 사용합니다. StandardRetryStrategy.Builder#throttlingBackoffStrategy를 사용하여 이 값을 조정할 수 있습니다.

  • 다운스트림 장애가 높은 경우 회로 중단(재시도 사용 해제)을 수행합니다. 첫 번째 시도는 항상 실행되며 재시도만 사용 해제됩니다. StandardRetryStrategy.Builder#circuitBreakerEnabled로 조정합니다.

레거시 재시도 전략

레거시 재시도 전략은 일반적인 사용 사례용 RetryStrategy이지만, StandardRetryStrategy를 위해 더 이상 사용되지 않습니다. 이는 다른 전략을 지정하지 않을 때 클라이언트가 사용하는 기본 재시도 전략입니다.

스로틀링 예외와 비스로틀링 예외를 다르게 처리하는 것이 특징이며, 스로틀링 예외의 경우 백오프의 기본 지연은 비스로틀링 예외의 기본 지연(100ms)보다 크고(500ms) 스로틀링 예외는 토큰 버킷 상태에 영향을 미치지 않습니다.

내부에서 이 전략을 규모에 맞게 사용한 경험에 따르면 AWS가 표준 재시도 전략보다 더 나은 것은 아닙니다. 또한 다운스트림 서비스를 재시도 급증에서 보호하지 못하여 클라이언트 측에서 리소스 부족이 발생할 수 있습니다.

기본적으로 레거시 재시도 전략은 다음을 수행합니다.

  • 구축 시 구성된 조건을 재시도합니다. LegacyRetryStrategy.Builder#retryOnException를 사용하여 이 값을 조정할 수 있습니다.

  • 총 4회 시도에서 3회 재시도합니다. LegacyRetryStrategy.Builder#maxAttempts(int)를 사용하여 이 값을 조정할 수 있습니다.

  • 스로틀링이 없는 예외의 경우 기본 지연 시간이 100밀리초이고 최대 지연 시간이 20초인 BackoffStrategy#exponentialDelay 백오프 전략을 사용합니다. LegacyRetryStrategy.Builder#backoffStrategy.를 사용하여 이 값을 조정할 수 있습니다.

  • 스로틀링 예외의 경우 기본 지연 시간이 500밀리초이고 최대 지연 시간이 20초인 BackoffStrategy#exponentialDelay 백오프 전략을 사용합니다. LegacyRetryStrategy.Builder#throttlingBackoffStrategy를 사용하여 이 값을 조정할 수 있습니다.

  • 다운스트림 장애가 높은 경우 회로 중단(재시도 사용 해제)을 수행합니다. 회로 차단으로 인해 첫 번째 시도가 성공할 수 없습니다. LegacyRetryStrategy.Builder#circuitBreakerEnabled를 사용하여 이 동작을 조정할 수 있습니다.

  • 회로 차단의 상태는 스로틀링 예외의 영향을 받지 않습니다.

적응형 재시도 전략

적응형 재시도 전략은 리소스 제약이 많은 사용 사례의 RetryStrategy입니다.

적응형 재시도 전략에는 표준 전략의 모든 기능이 포함되며 비스로틀링 요청과 비교하여 스로틀링 요청의 속도를 측정하는 클라이언트 측 속도 제한 도구가 추가됩니다. 전략은 이 측정을 사용하여 안전한 대역폭 내에 유지하려는 시도로 요청을 늦춰 스로틀링 오류가 발생하지 않는 것이 이상적입니다.

기본적으로 적응형 재시도 전략은 다음을 수행합니다.

  • 구축 시 구성된 조건을 재시도합니다. AdaptiveRetryStrategy.Builder#retryOnException를 사용하여 이 값을 조정할 수 있습니다.

  • 총 3회 시도에서 2회 재시도합니다. AdaptiveRetryStrategy.Builder#maxAttempts(int)를 사용하여 이 값을 조정할 수 있습니다.

  • 다운스트림 리소스에 대한 현재 로드를 기반으로 하는 동적 백오프 지연을 사용합니다.

  • 다운스트림 실패 횟수가 많을 때 회로 차단(재시도 사용 해제)을 수행합니다. 회로 차단은 다운스트림 서비스를 보호하기 위해 중단 시나리오에서 두 번째 시도를 방지할 수 있습니다.

주의

적응형 재시도 전략은 클라이언트가 단일 리소스(예: DynamoDB 테이블 하나 또는 Amazon S3 버킷 하나)에 대해 작동한다고 가정합니다.

단일 클라이언트를 여러 리소스에서 사용하는 경우 한 리소스와 연결된 스로틀링 또는 중단으로 인해 클라이언트가 다른 모든 리소스에 액세스할 때 지연 시간이 증가하고 장애가 발생합니다. 적응형 재시도 전략을 사용하는 경우 각 리소스에 대해 단일 클라이언트를 사용하는 것이 좋습니다.

또한 모든 클라이언트가 리소스에 대해 적응형 재시도 전략을 사용하는 경우에도 이 전략을 사용하는 것이 좋습니다.

중요

Java SDK 2.26.0을 사용한 재시도 전략 릴리스에는 새로운 RetryMode.ADAPTIVE_V2 열거 값이 포함되어 있습니다. ADAPTIVE_V2 모드는 이전에 스로틀링 오류가 감지되었을 때 첫 번째 시도를 지연시키지 못한 오류를 수정합니다.

2.26.0 릴리스에서는 환경 변수, 시스템 속성 또는 프로필 설정에서 모드를 adaptive로 설정하여 사용자가 자동으로 ADAPTIVE_V2 모드 동작을 가져옵니다. 이러한 설정에는 adaptive_v2 값이 없습니다. 모드를 설정하는 방법은 다음 전략 지정 섹션을 참조하세요.

사용자는 RetryMode.ADAPTIVE를 사용하여 코드에서 모드를 설정해 이전 동작을 가져올 수 있습니다.

요약: 재시도 전략 기본값 비교

다음 표에는 각 재시도 전략의 속성에 대한 기본값이 나와 있습니다.

Strategy 최대 시도 횟수 비스로틀링 오류의 기본 지연 스로틀링 오류의 기본 지연 토큰 버킷 크기 비스로틀링 재시도당 토큰 비용 스로틀링 재시도당 토큰 비용
표준 3 100ms 1000ms 500 5 5
레거시 4 100ms 500ms 500 5 0
적응형 3 100ms 100ms 500 5 5
참고

DynamoDB 클라이언트는 모든 재시도 전략에 대해 기본 최대 재시도 횟수(8회)를 사용하며, 이는 위의 표에 표시된 다른 AWS 서비스 클라이언트의 값보다 많습니다.

전략 지정

4가지 방법을 통해 서비스 클라이언트에 대한 전략을 지정할 수 있습니다.

코드에서

클라이언트를 구축할 때 재시도 전략을 사용하여 Lambda 표현식을 구성할 수 있습니다. 다음 코드 조각은 DynamoDB 서비스 클라이언트에서 기본값을 사용하는 표준 재시도 전략을 구성합니다.

DynamoDbClient client = DynamoDbClient.builder() .overrideConfiguration(o -> o.retryStrategy(RetryMode.STANDARD)) .build();

RetryMode.STANDARD 대신 RetryMode.LEGACY 또는 RetryMode.ADAPTIVE를 지정할 수 있습니다.

프로필 설정 기준

공유 AWS 구성 파일에 프로필 설정으로 retry_mode를 포함시킵니다. standard, legacy 또는 adaptive를 값으로 지정합니다. 프로필 설정으로 설정하면 프로필이 활성 상태인 동안 만들어진 모든 서비스 클라이언트는 기본값으로 지정된 재시도 전략을 사용합니다. 이전과 같이 코드에서 재시도 전략을 구성하여 이 설정을 재정의할 수 있습니다.

다음 프로필을 사용하면 모든 서비스 클라이언트가 표준 재시도 전략을 사용합니다.

[profile dev] region = us-east-2 retry_mode = standard

JVM 시스템 속성 기준

코드에서 재정의되지 않는 한 시스템 속성 aws.retryMode를 사용하여 모든 서비스 클라이언트에 대해 재시도 상태를 구성할 수 있습니다. standard, legacy 또는 adaptive를 값으로 지정합니다.

다음 명령과 같이 Java를 호출할 때 -D 스위치를 사용합니다.

java -Daws.retryMode=standard ...

또는 다음 코드 조각과 같이 클라이언트를 만들기 전에 코드에서 시스템 속성을 설정합니다.

public void main(String[] args) { // Set the property BEFORE any AWS service clients are created. System.setProperty("aws.retryMode", "standard"); ... }

환경 변수 사용

또는 값이 standard, legacy 또는 adaptiveAWS_RETRY_MODE 환경 변수를 사용할 수 있습니다. 프로필 설정 또는 JVM 시스템 속성과 마찬가지로 코드에서 클라이언트를 구성하지 않는 한 환경 변수는 지정된 재시도 모드로 모든 서비스 클라이언트를 구성합니다.

다음 명령은 현재 쉘 세션의 재시도 모드를 standard로 설정합니다.

export AWS_RETRY_MODE=standard

전략 사용자 지정

재시도 가능한 최대 시도 횟수, 백오프 전략 및 예외를 설정하여 모든 재시도 전략을 사용자 지정할 수 있습니다. 재시도 전략을 구축할 때 또는 구성된 전략을 추가로 구체화할 수 있는 재정의 빌더를 사용하여 클라이언트를 구축할 때 사용자 지정할 수 있습니다.

최대 시도 횟수 사용자 지정

다음 문과 같이 클라이언트 구문 중에 최대 시도 횟수를 구성할 수 있습니다. 다음 문은 클라이언트의 기본 재시도 전략을 최대 5회까지 사용자 지정합니다. 첫 번째 시도와 4회 재시도입니다.

DynamoDbClient client = DynamoDbClient.builder() .overrideConfiguration(o -> o.retryStrategy(b -> b.maxAttempts(5))) .build();

또는 다음 코드 예제와 같이 전략을 구축하여 클라이언트에 제공할 수 있습니다. 다음 코드는 표준 최대 3회 시도를 10회로 대체하고 DynamoDB 클라이언트를 사용자 지정 전략으로 구성합니다.

StandardRetryStrategy strategy = AwsRetryStrategy.standardRetryStrategy() .toBuilder() .maxAttempts(10) .build(); DynamoDbClient client = DynamoDbClient.builder() .overrideConfiguration(o -> o.retryStrategy(strategy)) .build();
주의

각 클라이언트를 고유한 RetryStrategy 인스턴스로 구성하는 것이 좋습니다. RetryStrategy 인스턴스를 공유하는 경우 한 클라이언트의 장애가 다른 클라이언트의 재시도 동작에 영향을 미칠 수 있습니다.

코드 대신 외부 설정을 사용하여 모든 클라이언트에 대한 최대 시도 횟수를 설정할 수도 있습니다. 전략 지정 섹션에 설명된 대로 이 설정을 구성합니다.

재시도 가능한 예외 사용자 지정

클라이언트 구문 중에 재시도를 트리거하는 추가 예외를 구성할 수 있습니다. 이 사용자 지정은 기본 재시도 가능 예외 세트에 포함되지 않은 예외가 발생하는 엣지 사례에 제공됩니다.

retryOnExceptionretryOnExceptionOrCause 메서드는 기존 재시도 가능한 예외 세트에 새 예외 유형을 추가하지만 기본 세트를 대체하지 않습니다. 이렇게 하면 SDK의 기본 재시도 기능을 유지하면서 재시도 동작을 확장할 수 있습니다.

SDK에서 직접 예외가 발생하거나 예외가 다른 예외의 원인으로 래핑되는 경우 retryOnExceptionOrCause 메서드는 재시도 가능한 예외를 추가합니다.

다음 코드 조각은 재시도 예외(retryOnExceptionretryOnExceptionOrCause)를 사용자 지정하는 데 사용하는 메서드를 보여줍니다. SDK에서 직접 예외가 발생하거나 예외가 래핑된 경우 retryOnExceptionOrCause 메서드는 재시도 가능한 예외를 추가합니다.

DynamoDbClient client = DynamoDbClient.builder() .overrideConfiguration(o -> o.retryStrategy( b -> b.retryOnException(EdgeCaseException.class) .retryOnExceptionOrCause(WrappedEdgeCaseException.class))) .build();
중요

재시도 전략 구성에 관계없이 subscribeToShard 메서드를 호출하면 Kinesis 비동기식 클라이언트에 대해 재시도가 사용 해제됩니다.

백오프 전략 사용자 지정

백오프 전략을 구축하여 클라이언트에 제공할 수 있습니다.

다음 코드는 기본 표준 전략의 지수 지연 백오프 전략을 대체하는 BackoffStrategy를 구축합니다.

BackoffStrategy backoffStrategy = BackoffStrategy.exponentialDelay(Duration.ofMillis(150), // The base delay. Duration.ofSeconds(15)); // The maximum delay. DynamoDbClient client = DynamoDbClient.builder() .overrideConfiguration(o -> o.retryStrategy( b -> b.backoffStrategy(backoffStrategy))) .build();

RetryPolicy에서 RetryStrategy로 마이그레이션

RetryPolicy(재시도 정책 API)는 가까운 미래에 지원될 예정입니다. 현재 RetryPolicy의 인스턴스를 사용하여 클라이언트를 구성하는 경우 모든 사항이 이전과 같이 작동합니다. 백그라운드에서 Java SDK는 이를 RetryStrategy에 적용합니다. 새로운 재시도 전략 인터페이스는 RetryPolicy와 동일한 기능을 제공하지만 다르게 만들어지고 구성됩니다.