

适用于 JavaScript 的 AWS SDK v2 已终止支持。建议您迁移到 [适用于 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 服务器、交换机、负载均衡器等) 都可能在某个指定请求生命周期中的任一环节出现问题。在联网环境中，处理这些错误响应的常规技术是在客户应用程序中实施重试。该技术可以提高应用程序的可靠性和降低开发人员的操作成本。AWSSDK 为您的 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 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>

适用于 JavaScript 的 AWS SDK v2 支持传递一个以毫秒为单位的自定义基数，用于操作重试的指数回退中。对于所有服务，其默认值均为 100 毫秒，但 DynamoDB 除外（默认为 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
```