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

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

重试和超时

Amazon SDK for .NET让您可以配置针对 Amazon 服务的 HTTP 请求的重试次数和超时值。如果重试和超时的默认值不适用于您的应用程序,您可以针对具体要求调整这些值,但请务必了解这样做将对应用程序的行为带来什么影响。

在确定重试和超时值时,请考虑以下因素:

  • 在网络连接降级或无法访问 Amazon 服务时,Amazon SDK for .NET和您的应用程序将如何响应? 您是希望调用快速失败,还是希望调用代表您不断重试?

  • 您的应用程序是必须能够及时响应的面向用户的应用程序或网站,还是更能容忍延迟增加的后台处理任务?

  • 应用程序是部署在具有低延迟的可靠网络上,还是部署在具有不可靠连接的远程位置?

重试

概述

Amazon SDK for .NET可以重试因服务器端限制或断开连接导致失败的请求。服务配置类有两个属性可用于指定服务客户端的重试行为。服务配置类继承了抽象的 Amazon.Runtime 中的这些属性。 ClientConfigAmazon SDK for .NETAPI 参考的类别:

  • RetryMode指定三种重试模式之一,这些模式在 Amazon.Runtime 中定义。 RequestRetryMode枚举。

    可以使用 AWS_RETRY_MODE 环境变量或共享 Amazon 配置文件中的 retry_mode 设置来控制应用程序的默认值。

  • MaxErrorRetry 指定服务客户端级别允许的重试次数;SDK 会在失败并引发异常之前按指定的次数重试该操作。

    可以使用 AWS_MAX_ATTEMPTS 环境变量或共享 Amazon 配置文件中的 max_attempts 设置来控制应用程序的默认值。

这些属性的详细描述可以在摘要的 Amazon.Runtime 中找到。 ClientConfigAmazon SDK for .NETAPI 参考的类别。默认情况下,RetryMode 的每个值对应一个特定的 MaxErrorRetry 值,如下表所示。

RetryMode Corresponding MaxErrorRetry (Amazon DynamoDB) Corresponding MaxErrorRetry (all others)
Legacy 10 4
Standard 10 2
Adaptive (experimental) 10 2

行为

当应用程序启动时

应用程序启动时,RetryModeMaxErrorRetry 的默认值由 SDK 配置。除非您指定其它值,否则在创建服务客户端时将使用这些默认值。

  • 如果您的环境中未设置这些属性,则 RetryMode 的默认值将配置为 Legacy,而 MaxErrorRetry 的默认值将配置为上表中的相应值。

  • 如果您的环境中设置了重试模式,则该值将用作 RetryMode 的默认值。MaxErrorRetry 的默认值将配置为上表中的相应值,除非您的环境中也设置了最大错误的值(下文将介绍)。

  • 如果您的环境中设置了最大错误的值,则该值将用作 MaxErrorRetry 的默认值。Amazon DynamoDB 是该规则的例外;MaxErrorRetry 的默认 DynamoDB 值始终是上表中的值。

当您的应用程序运行时

创建服务客户端时,可以使用 RetryModeMaxErrorRetry 的默认值(如前所述),也可以指定其它值。要指定其他值,请在创建服务客户端时创建并添加服务配置对象,例如 AmazonDynamodbConfig 或 Amazon SqsC onfig。

一旦为服务客户端创建这些值,便不可更改。

注意事项

在进行重试时,会增加请求的延迟。您应根据应用程序对请求总延迟和错误率的限制来配置重试次数。

超时

Amazon SDK for .NET可让您配置服务客户端级别的请求超时和套接字读取/写入超时值。这些值是在抽象 Amazon.Runtime 的TimeoutReadWriteTimeout属性中指定的。 ClientConfig班级。这些值作为Amazon服务客户端HttpWebRequest对象创建的对象的TimeoutReadWriteTimeout属性传递。默认情况下,Timeout 值为 100 秒,ReadWriteTimeout 值为 300 秒。

当您的网络具有高延迟或存在导致操作重试的情况时,使用较长的超时值和较高的重试次数会导致一些开发工具包操作看上去没有响应。

注意

以便携式类库 (PCL) 为目标的版本使用该HttpClient类而不是HttpWebRequest类,并且仅支持 Timeout 属性。Amazon SDK for .NET

以下是默认超时值的例外情况。明确设置超时值时将覆盖这些值。

示例

以下示例说明如何指定标准重试模式、最多 3 次的重试次数、10 秒超时值以及 10 秒的读取/写入超时值(如果适用)。Amazons3Client 构造函数被赋予一个 AmazonS3Config 对象。

var s3Client = new AmazonS3Client( new AmazonS3Config { Timeout = TimeSpan.FromSeconds(10), // NOTE: The following property is obsolete for // versions of the Amazon SDK for .NET that target .NET Core. ReadWriteTimeout = TimeSpan.FromSeconds(10), RetryMode = RequestRetryMode.Standard, MaxErrorRetry = 3 });