

AWS SDK for JavaScript v2가 지원 종료에 도달했습니다. [AWS SDK for JavaScript v3](https://docs.aws.amazon.com//sdk-for-javascript/v3/developer-guide/)로 마이그레이션하실 것을 권장합니다. 마이그레이션 방법에 대한 자세한 내용은 해당 [공지 사항](https://aws.amazon.com/blogs//developer/announcing-end-of-support-for-aws-sdk-for-javascript-v2/)을 참조하세요.

# AWS SDK for JavaScript v2의 재시도 전략
<a name="retry-strategy"></a>

DNS 서버, 스위치, 로드 밸런서 등 수많은 네트워크 구성 요소들은 요청이 이루어지는 모든 단계에서 오류를 일으킬 수 있습니다. 네트워크 환경에서는 클라이언트 애플리케이션의 재시도 기술이 이러한 오류 응답을 처리하는 데 가장 많이 사용되고 있습니다. 이 기술은 애플리케이션의 신뢰성을 높일 뿐만 아니라 개발자의 운영 비용을 절감합니다. AWS SDK는 AWS 요청에 대한 자동 재시도 로직을 구현합니다.

## 지수 백오프 기반 재시도 동작
<a name="retry-behavior"></a>

AWS SDK for JavaScript v2는 흐름 제어를 개선하기 위해 [전체 지터(jitter)와 함께 지수 백오프](https://aws.amazon.com/builders-library/timeouts-retries-and-backoff-with-jitter/#Jitter)를 사용하여 재시도 로직을 구현합니다. 지수 백오프의 기본 개념은 오류 응답이 연이어 나올 때마다 재시도 간 대기 시간을 점진적으로 늘리는 것입니다. 지터(무작위 지연)는 연속 충돌을 방지하는 데 사용됩니다.

### v2에서 재시도 지연 테스트
<a name="w2aac18c37b5b5"></a>

v2에서 재시도 지연을 테스트하기 위해 [node\$1modules/aws-sdk/lib/event\$1listeners.js](https://github.com/aws/aws-sdk-js/blob/master/lib/event_listeners.js#L588)의 코드가 다음과 같이 가변 지연에 있는 `console.log` 값으로 업데이트되었습니다.

```
// delay < 0 is a signal from customBackoff to skip retries
if (willRetry && delay >= 0) {
  resp.error = null;
  console.log('retry delay: ' + delay);
  setTimeout(done, delay);
} else {
  done();
}
```

#### 기본 구성으로 지연 재시도
<a name="w2aac18c37b5b5b7"></a>

AWS SDK 클라이언트에서 모든 작업에 대한 지연을 테스트할 수 있습니다. 다음 코드를 사용하여 DynamoDB 클라이언트에서 `listTables` 작업을 호출합니다.

```
import AWS from "aws-sdk";

const region = "us-east-1";
const client = new AWS.DynamoDB({ region });
await client.listTables({}).promise();
```

재시도를 테스트하기 위해 테스트 코드를 실행하는 디바이스에서 인터넷 연결을 해제하여 `NetworkingError`를 시뮬레이션합니다. 또한 사용자 지정 오류를 반환하도록 프록시를 설정할 수 있습니다.

코드를 실행할 때 다음과 같이 지터와 함께 지수 백오프를 사용하여 재시도 지연을 확인할 수 있습니다.

```
retry delay: 7.39361151766359
retry delay: 9.0672860785882
retry delay: 134.89340825668168
retry delay: 398.53559817403965
retry delay: 523.8076165896343
retry delay: 1323.8789643058465
```

재시도는 지터를 사용하므로 예제 코드를 실행할 때 다른 값을 얻을 수 있습니다.

#### 사용자 지정 기본으로 지연 재시도
<a name="w2aac18c37b5b5b9"></a>

AWS SDK for JavaScript v2를 사용하면 작업 재시도에 대한 지수 백오프에 사용할 사용자 지정 기본 밀리초를 전달할 수 있습니다. DynamoDB를 제외한 모든 서비스의 기본값은 100ms이며, 여기서 기본값은 50ms입니다.

다음과 같이 사용자 지정 기본값이 1,000ms인 재시도를 테스트합니다.

```
...
const client = new AWS.DynamoDB({ region, retryDelayOptions: { base: 1000 } });
...
```

테스트 코드를 실행하는 디바이스에서 인터넷 연결을 해제하여 `NetworkingError`를 시뮬레이션합니다. 기본값이 50ms 또는 100ms인 이전 실행에 비해 재시도 지연 값이 더 높다는 것을 알 수 있습니다.

```
retry delay: 356.2841549924913
retry delay: 1183.5216495444615
retry delay: 2266.997988094194
retry delay: 1244.6948354966453
retry delay: 4200.323030066383
```

재시도는 지터를 사용하므로 예제 코드를 실행할 때 다른 값을 얻을 수 있습니다.

#### 사용자 지정 백오프 알고리즘을 사용하여 지연 재시도
<a name="w2aac18c37b5b5c11"></a>

또한 AWS SDK for JavaScript v2를 사용하면 재시도 횟수와 오류를 수락하고 지연 시간을 밀리초 단위로 반환하는 사용자 지정 백오프 함수를 전달할 수 있습니다. 결과가 0이 아닌 음수 값이면 더 이상 재시도하지 않습니다.

다음과 같이 기본값이 200ms인 선형 백오프를 사용하는 사용자 지정 백오프 함수를 테스트합니다.

```
...
const client = new AWS.DynamoDB({
  region,
  retryDelayOptions: { customBackoff: (count, error) => (count + 1) * 200 },
});
...
```

테스트 코드를 실행하는 디바이스에서 인터넷 연결을 해제하여 `NetworkingError`를 시뮬레이션합니다. 재시도 지연 값은 200의 배수입니다.

```
retry delay: 200
retry delay: 400
retry delay: 600
retry delay: 800
retry delay: 1000
```