在Amazon SDK for JavaScript v2 中重试策略 - Amazon SDK for JavaScript
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

Amazon SDK for JavaScript v2 已终止支持。建议您迁移到 Amazon SDK for JavaScript v3。有关更多详情和如何迁移的信息,请参阅本公告

在Amazon SDK for JavaScript v2 中重试策略

网络上的大量组件 (例如 DNS 服务器、交换机、负载均衡器等) 都可能在某个指定请求生命周期中的任一环节出现问题。在联网环境中,处理这些错误响应的常规技术是在客户应用程序中实施重试。该技术可以提高应用程序的可靠性和降低开发人员的操作成本。AmazonSDK 为您的 Amazon 请求实现自动重试逻辑。

基于指数回退的重试行为

Amazon SDK for JavaScript v2 使用指数回退及完全抖动实现重试逻辑,以获得更好的流量控制。指数回退的原理是对于连续错误响应,重试等待间隔越来越长。抖动(随机延迟)用于防止连续的冲突。

在 v2 中测试重试延迟

为了在 v2 中测试重试延迟,node_modules/aws-sdk/lib/event_listeners.js 中的代码已更新为 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(); }

默认配置下的重试延迟

您可以在 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

由于重试使用抖动,因此在运行示例代码时您将获得不同的值。

使用自定义基数的重试延迟

Amazon SDK for JavaScript 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

由于重试使用抖动,因此在运行示例代码时您将获得不同的值。

使用自定义回退算法的重试延迟

Amazon SDK for JavaScript 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