

 適用於 JavaScript 的 AWS SDK v2 已end-of-support。我們建議您遷移至 [適用於 JavaScript 的 AWS SDK 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/)。

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 適用於 JavaScript 的 AWS SDK v2 中的重試策略
<a name="retry-strategy"></a>

網路上有許多元件 (例如 DNS 伺服器、交換器、負載平衡器和其他項目) 可以在指定請求之生命週期中的任何階段產生錯誤。一般在網路環境中處理這些錯誤回應的技術，就是在用戶端應用程式中實作重試。此技術可提高應用程式的可靠性，並降低 developer. AWS SDKs的操作成本，為您的 AWS 請求實作自動重試邏輯。

## 指數退避型重試行為
<a name="retry-behavior"></a>

 適用於 JavaScript 的 AWS SDK 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 開發套件用戶端上測試任何操作的延遲。我們使用下列程式碼呼叫 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>

 適用於 JavaScript 的 AWS SDK v2 允許傳遞自訂基本毫秒數，以用於操作重試的指數退避。DynamoDB 以外的所有服務預設為 100 毫秒，其預設為 50 毫秒。

我們會使用 1000 毫秒的自訂基底來測試重試，如下所示：

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

 適用於 JavaScript 的 AWS SDK v2 也允許傳遞接受重試計數和錯誤的自訂退避函數，並傳回以毫秒為單位的延遲時間。如果結果是非零的負值，則不會再嘗試重試。

我們測試自訂退避函數，其使用基本值為 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
```