

 AWS SDK for .NET V3가 유지 관리 모드로 전환되었습니다.

[AWS SDK for .NET V4](https://docs.aws.amazon.com/sdk-for-net/v4/developer-guide/welcome.html)로 마이그레이션하는 것이 좋습니다. 마이그레이션 방법에 대한 자세한 내용과 정보는 [유지 관리 모드 공지](https://aws.amazon.com/blogs/developer/aws-sdk-for-net-v3-maintenance-mode-announcement/)를 참조하세요.

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

# 재시도 및 제한 시간
<a name="retries-timeouts"></a>

를 AWS SDK for .NET 사용하면 AWS 서비스에 대한 HTTP 요청의 재시도 횟수와 제한 시간 값을 구성할 수 있습니다. 재시도 횟수 및 제한 시간의 기본값이 해당 애플리케이션에 적절하지 않은 경우 특정 요구사항에 맞게 조정할 수 있지만, 그렇게 함으로써 해당 애플리케이션의 작동에 어떤 영향을 미칠지 먼저 이해하는 것이 중요합니다.

재시도 횟수 및 제한 시간에 어떤 값을 사용할지 결정하려면 다음 사항을 고려하십시오.
+ 네트워크 연결이 저하되거나 AWS 서비스에 연결할 수 없는 경우 AWS SDK for .NET 및 애플리케이션은 어떻게 응답해야 합니까? 호출이 신속하게 실패하길 원하는가, 아니면 호출이 사용자를 대신하여 계속 재시도하는 것이 적절한가?
+ 해당 애플리케이션은 응답이 필수적인 사용자 지향 애플리케이션이나 웹 사이트인가, 아니면 지연 시간 증가를 더 많이 허용하는 백그라운드 처리 작업인가?
+ 애플리케이션이 지연 시간이 짧은 안정적인 네트워크에 배포되는가, 아니면 연결성이 불안정한 원격 위치에 배포되는가?

## 재시도
<a name="retries"></a>

### 개요
<a name="w2aac11c13c11b5"></a>

는 서버 측 제한 또는 연결 끊김으로 인해 실패한 요청을 재시도할 AWS SDK for .NET 수 있습니다. 서비스 구성 클래스에는 서비스 클라이언트의 재시도 동작을 지정하는 데 사용할 수 있는 두 가지 속성이 있습니다. 서비스 구성 클래스는 [AWS SDK for .NET API 참조](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/)의 추상 [Amazon.Runtime.ClientConfig](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/Runtime/TClientConfig.html) 클래스에서 다음과 같은 속성을 상속합니다.
+ `RetryMode`는 [Amazon.Runtime.RequestRetryMode](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/Runtime/TRequestRetryMode.html) 열거에 정의된 세 가지 재시도 모드 중 하나를 지정합니다.

  애플리케이션의 기본값은 `AWS_RETRY_MODE` 환경 변수 또는 공유 AWS 구성 파일의 *retry\$1mode* 설정을 사용하여 제어할 수 있습니다.
+ `MaxErrorRetry`는 서비스 클라이언트 수준에서 허용되는 재시도 횟수를 지정합니다. SDK는 작업이 실패하고 예외가 발생하기 전에 지정된 횟수만큼 작업을 재시도합니다.

  애플리케이션의 기본값은 `AWS_MAX_ATTEMPTS` 환경 변수 또는 공유 AWS 구성 파일의 *max\$1attempts* 설정을 사용하여 제어할 수 있습니다.

이러한 속성에 대한 자세한 설명은 [AWS SDK for .NET API 참조](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/)의 추상 [Amazon.Runtime.ClientConfig](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/Runtime/TClientConfig.html) 클래스에서 확인할 수 있습니다. `RetryMode`의 각 값은 기본적으로 다음 표에 표시된 것처럼 `MaxErrorRetry`의 특정 값에 해당합니다.

|  |  |  | 
| --- |--- |--- |
| Legacy | 10 | 4 | 
| Standard | 10 | 2 | 
| Adaptive (experimental) | 10 | 2 | 

### 동작
<a name="w2aac11c13c11b9"></a>

**애플리케이션이 시작되는 시점**

애플리케이션이 시작되면 SDK에서 `RetryMode` 및 `MaxErrorRetry`의 기본값을 구성합니다. 이러한 기본값은 다른 값을 지정하지 않는 한 서비스 클라이언트를 생성할 때 사용됩니다.
+ 환경에 속성이 설정되지 않은 경우 `RetryMode`의 기본값은 레거시로 구성되고 `MaxErrorRetry`의 기본값은 위 표의 해당 값으로 구성됩니다.**
+ 환경에서 재시도 모드가 설정된 경우 해당 값이 `RetryMode`의 기본값으로 사용됩니다. 환경에 최대 오류 값도 설정되어 있지 않은 경우(다음 설명 참조) `MaxErrorRetry`의 기본값은 위 표의 해당 값으로 구성됩니다.
+ 환경에서 최대 오류 값이 설정된 경우 해당 값이 `MaxErrorRetry`의 기본값으로 사용됩니다. Amazon DynamoDB는 이 규칙의 예외입니다. `MaxErrorRetry`에 대한 DynamoDB의 기본 값은 항상 위 표의 값입니다.

**애플리케이션이 실행될 때**

서비스 클라이언트를 생성할 때 앞에서 설명한 대로 `RetryMode` 및 `MaxErrorRetry`의 기본값을 사용하거나 다른 값을 지정할 수 있습니다. 다른 값을 지정하려면 서비스 클라이언트를 생성할 때 [AmazonDynamoDBConfig](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/DynamoDBv2/TDynamoDBConfig.html) 또는 [AmazonSQSConfig](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/SQS/TSQSConfig.html)와 같은 서비스 구성 객체를 생성하여 포함시킵니다.

서비스 클라이언트가 생성된 이후에는 그 값을 바꿀 수 없습니다.

**고려 사항**

재시도가 이루어지면 해당 요청의 지연 시간이 늘어납니다. 총 요청 지연 시간 및 오류율에 대한 애플리케이션의 제한에 따라 재시도를 구성해야 합니다.

## 시간 초과
<a name="timeouts"></a>

를 AWS SDK for .NET 사용하면 서비스 클라이언트 수준 및 메서드 호출당 요청 제한 시간을 구성할 수 있습니다. 제한 시간을 구성하는 두 가지 메커니즘이 있으며, 이는 후속 섹션에서 다룹니다.
+ [비동기 직접 호출](#timeouts-async)을 사용하는 경우 메서드의 `CancellationToken` 파라미터를 사용할 수 있습니다.
+ [.NET Framework에서 동기 직접 호출](#timeouts-sync-framework)을 사용하는 경우 추상 [Amazon.Runtime.ClientConfig](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/Runtime/TClientConfig.html) 클래스의 `Timeout` 및 `ReadWriteTimeout` 속성을 사용할 수 있습니다.

### 제한 시간에 `CancellationToken` 파라미터 사용
<a name="timeouts-async"></a>

를 AWS SDK for .NET 사용하면 `CancellationToken` 파라미터를 사용하여 비동기 호출에 대한 요청 제한 시간을 구성할 수 있습니다. 다음 코드 조각은 예제를 보여 줍니다. 요청이 10초 이내에 완료되지 않으면 코드에서 `System.Threading.Tasks.TaskCanceledException`이 발생합니다.

```
string bucketName = "amzn-s3-demo-bucket";
string path = "pathToBucket";
using (var amazonS3Client = new AmazonS3Client(new AmazonS3Config()))
{
    // Cancel request after 10 seconds
    CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(TimeSpan.FromMilliseconds(10000));
    CancellationToken cancellationToken = cancellationTokenSource.Token;
    ListObjectsV2Request listRequestV2 = new()
    {
        BucketName = bucketName,
        Prefix = path,
    };

    ListObjectsV2Response listResponseV2 = await amazonS3Client.ListObjectsV2Async(listRequestV2, cancellationToken);
}
```

### 제한 시간에 `Timeout` 및 `ReadWriteTimeout` 속성 사용
<a name="timeouts-sync-framework"></a>

**참고**  
`Timeout` 속성은 비동기 직접 호출에 영향을 주지 않습니다. 비동기 직접 호출을 사용하는 경우 [제한 시간에 `CancellationToken` 파라미터 사용](#timeouts-async)을 대신 참조하세요.

를 AWS SDK for .NET 사용하면 서비스 클라이언트 수준에서 요청 제한 시간 및 소켓 읽기/쓰기 제한 시간 값을 구성할 수 있습니다. 이러한 값은 추상 [Amazon.Runtime.ClientConfig](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/Runtime/TClientConfig.html) 클래스의 `Timeout` 및 `ReadWriteTimeout` 속성에 지정됩니다. 이러한 값은 AWS 서비스 클라이언트 객체에 의해 생성된 [HttpWebRequest](https://learn.microsoft.com/en-us/dotnet/api/system.net.httpwebrequest) 객체의 `Timeout` 및 `ReadWriteTimeout` 속성으로 전달됩니다. `Timeout` 값은 100초, `ReadWriteTimeout` 값은 300초로 기본 설정되어 있습니다.

해당 네트워크의 지연 시간이 길거나 작업 재시도를 유발하는 조건이 존재하는 경우 제한 시간 및 재시도 횟수의 값을 높이면 일부 SDK 작업이 응답하지 않는 것처럼 보일 수 있습니다.

**참고**  
휴대용 클래스 라이브러리(PCL)를 대상으로 AWS SDK for .NET 하는의 버전은 클래스 대신 [HttpClient](https://learn.microsoft.com/en-us/dotnet/api/system.net.http.httpclient) `HttpWebRequest` 클래스를 사용하며 [제한 시간](https://learn.microsoft.com/en-us/dotnet/api/system.net.http.httpclient.timeout) 속성만 지원합니다.

다음은 기본 설정된 제한 시간 값에 대한 예외입니다. 제한 시간 값을 명시적으로 설정하면 이 값들은 무시됩니다.
+ `Timeout` 및 `ReadWriteTimeout`은 호출되는 메서드가 [AmazonS3Client.PutObjectAsync()](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/S3/MS3PutObjectAsyncPutObjectRequestCancellationToken.html), [AmazonS3Client.UploadPartAsync()](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/S3/MS3UploadPartAsyncUploadPartRequestCancellationToken.html), [AmazonGlacierClient.UploadArchiveAsync()](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/Glacier/MGlacierUploadArchiveAsyncUploadArchiveRequestCancellationToken.html)와 같은 스트림을 업로드하는 경우 최대값으로 설정됩니다.
+ .NET Framework를 대상으로 AWS SDK for .NET 하는의 버전은 `Timeout` 및 `ReadWriteTimeout`를 모든 [AmazonS3Client](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/S3/TS3Client.html) 및 [AmazonGlacierClient](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/Glacier/TGlacierClient.html) 객체의 최대값으로 설정합니다.
+ 휴대용 클래스 라이브러리(PCL) 및 .NET Core를 대상으로 AWS SDK for .NET 하는의 버전은 모든 [AmazonS3Client](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/S3/TS3Client.html) 및 [AmazonGlacierClient](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/Glacier/TGlacierClient.html) 객체의 최대값`Timeout`으로 설정됩니다.

다음 예제에서는 *표준* 재시도 모드, 최대 3회의 재시도, 제한 시간 10초, 쓰기/읽기 제한 시간 10초를 지정하는 방법을 보여줍니다(해당하는 경우). [AmazonS3Client](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/S3/TS3Client.html) 생성자에는 [AmazonS3Config](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/S3/TS3Config.html) 객체가 제공됩니다.

```
var s3Client = new AmazonS3Client(
  new AmazonS3Config
  {
    Timeout = TimeSpan.FromSeconds(10),
    // NOTE: The following property is obsolete for
    //       versions of the AWS SDK for .NET that target .NET Core.
    ReadWriteTimeout = TimeSpan.FromSeconds(10),
    RetryMode = RequestRetryMode.Standard,
    MaxErrorRetry = 3
  });
```