

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 サーバー、スイッチ、ロードバランサーなど、ネットワークの多数のコンポーネントが、特定のリクエストの存続期間中どこでもエラーを生成する可能性があります。ネットワーク環境でこれらのエラー応答を処理する通常の方法は、クライアントアプリケーションで再試行を実装することです。この技術は、アプリケーションの信頼性を向上させ、開発者の運用コストを削減します。AWSSDK は、AWS リクエストの自動再試行ロジックを実装します。

## エクスポネンシャルバックオフベースの再試行動作
<a name="retry-behavior"></a>

AWS SDK for JavaScript v2 は、[フルジッターによるエクスポネンシャルバックオフ](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 を除くすべてのサービスでは、デフォルトで 100 ミリ秒に設定されます。DynamoDB では、デフォルトで 50 ミリ秒に設定されます。

次のように 1,000 ミリ秒のカスタムベースで再試行をテストします。

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

テストコードを実行しているデバイスからインターネットを切断して `NetworkingError` をシミュレートします。再試行の遅延の値は、デフォルトが 50 または 100 ミリ秒であった以前の実行と比較して高いことがわかります。

```
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 以外の負の値の場合、それ以上の再試行は行われません。

次のように、基本値が 200 ミリ秒の線形バックオフを使用するカスタムバックオフ関数をテストします。

```
...
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
```