适用于 .NET 的 Amazon SDK 版本 4(V4)已经发布!
要开始使用新版本的 SDK,请参阅 适用于 .NET 的 Amazon SDK(V4)开发人员指南,尤其是关于迁移到版本 4 的主题。
重试和超时
适用于 .NET 的 Amazon SDK让您可以配置针对 Amazon 服务的 HTTP 请求的重试次数和超时值。如果重试和超时的默认值不适用于您的应用程序,您可以针对具体要求调整这些值,但请务必了解这样做将对应用程序的行为带来什么影响。
在确定重试和超时值时,请考虑以下因素:
-
在网络连接降级或无法访问 Amazon 服务时,适用于 .NET 的 Amazon SDK和您的应用程序将如何响应? 您是希望调用快速失败,还是希望调用代表您不断重试?
-
您的应用程序是必须能够及时响应的面向用户的应用程序或网站,还是更能容忍延迟增加的后台处理任务?
-
应用程序是部署在具有低延迟的可靠网络上,还是部署在具有不可靠连接的远程位置?
重试
概览
适用于 .NET 的 Amazon SDK可以重试因服务器端限制或断开连接导致失败的请求。服务配置类有两个属性可用于指定服务客户端的重试行为。服务配置类从适用于 .NET 的 Amazon SDK API 参考的 Amazon.Runtime.ClientConfig 类继承了这些属性:
-
RetryMode指定三种重试模式之一,这些模式在 Amazon.Runtime.RequestRetryMode 枚举中定义。可以使用
AWS_RETRY_MODE环境变量或共享 Amazon 配置文件中的 retry_mode 设置来控制应用程序的默认值。
-
MaxErrorRetry指定服务客户端级别允许的重试次数;SDK 会在失败并引发异常之前按指定的次数重试该操作。可以使用
AWS_MAX_ATTEMPTS环境变量或共享 Amazon 配置文件中的 max_attempts 设置来控制应用程序的默认值。
这些属性的详细描述可以在适用于 .NET 的 Amazon SDK API 参考的 Amazon.Runtime.ClientConfig 类中找到。默认情况下,RetryMode 的每个值对应一个特定的 MaxErrorRetry 值,如下表所示。
| RetryMode | Corresponding MaxErrorRetry (Amazon DynamoDB) | Corresponding MaxErrorRetry (all others) |
|---|---|---|
| Legacy | 10 | 4 |
| Standard | 10 | 2 |
| Adaptive (experimental) | 10 | 2 |
行为
当应用程序启动时
应用程序启动时,RetryMode 和 MaxErrorRetry 的默认值由 SDK 配置。除非您指定其它值,否则在创建服务客户端时将使用这些默认值。
-
如果您的环境中未设置这些属性,则
RetryMode的默认值将配置为 Legacy,而MaxErrorRetry的默认值将配置为上表中的相应值。 -
如果您的环境中设置了重试模式,则该值将用作
RetryMode的默认值。MaxErrorRetry的默认值将配置为上表中的相应值,除非您的环境中也设置了最大错误的值(下文将介绍)。 -
如果您的环境中设置了最大错误的值,则该值将用作
MaxErrorRetry的默认值。Amazon DynamoDB 是该规则的例外;MaxErrorRetry的默认 DynamoDB 值始终是上表中的值。
当您的应用程序运行时
创建服务客户端时,可以使用 RetryMode 和 MaxErrorRetry 的默认值(如前所述),也可以指定其它值。要指定其它值,请在创建服务客户端时创建并添加服务配置对象,例如 AmazonDynamoDBConfig 或 AmazonSQSConfig。
一旦为服务客户端创建这些值,便不可更改。
注意事项:
在进行重试时,会增加请求的延迟。您应根据应用程序对请求总延迟和错误率的限制来配置重试次数。
超时
适用于 .NET 的 Amazon SDK 使您能够在服务客户端级别以及按方法调用配置请求超时。有两种配置超时的机制,后续章节将介绍这些机制:
-
如果您使用的是异步调用,则可以使用该方法的
CancellationToken参数。 -
如果您使用的是 .NET Framework 中的同步调用,则可以使用抽象 Amazon.Runtime.ClientConfig 类的
Timeout和ReadWriteTimeout属性。
使用 CancellationToken 参数配置超时
适用于 .NET 的 Amazon SDK 让您能够使用 CancellationToken 参数配置异步调用的请求超时。下面的代码片段展示了一个示例。如果请求未在 10 秒内完成,则代码会引发 System.Threading.Tasks.TaskCanceledException。
string bucketName = "amzn-s3-demo-bucket"; string path = "pathToBucket"; using (var amazonS3Client = new AmazonS3Client(new AmazonS3Config())) { // Cancel request after 10 seconds CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(TimeSpan.FromMilliseconds(10000)); CancellationToken cancellationToken = cancellationTokenSource.Token; ListObjectsV2Request listRequestV2 = new() { BucketName = bucketName, Prefix = path, }; ListObjectsV2Response listResponseV2 = await amazonS3Client.ListObjectsV2Async(listRequestV2, cancellationToken); }
使用 Timeout 和 ReadWriteTimeout 属性配置超时
注意
Timeout 属性不会影响异步调用。如果您使用的是异步调用,请参阅使用 CancellationToken 参数配置超时。
适用于 .NET 的 Amazon SDK可让您配置服务客户端级别的请求超时和套接字读取/写入超时值。抽象 Amazon.Runtime.ClientConfig 类的 Timeout 和 ReadWriteTimeout 属性中分别指定了这些值。这些值作为由 Amazon 服务客户端对象创建的 HttpWebRequestTimeout 和 ReadWriteTimeout 属性传递。默认情况下,Timeout 值为 100 秒,ReadWriteTimeout 值为 300 秒。
当您的网络具有高延迟或存在导致操作重试的情况时,使用较长的超时值和较高的重试次数会导致一些开发工具包操作看上去没有响应。
注意
针对可移植类库 (PCL) 的适用于 .NET 的 Amazon SDK版本使用 HttpClientHttpWebRequest 类,并且仅支持 Timeout
以下是默认超时值的例外情况。明确设置超时值时将覆盖这些值。
-
如果所调用的方法上传一个流(例如,AmazonS3Client.PutObjectAsync()、AmazonS3Client.UploadPartAsync()、AmazonGlacierClient.UploadArchiveAsync() 等),则
Timeout和ReadWriteTimeout将设置为最大值。 -
对于所有 AmazonS3Client 和 AmazonGlacierClient 对象,针对 .NET Framework 的适用于 .NET 的 Amazon SDK 版本会将
Timeout和ReadWriteTimeout都设置为最大值。 -
对于所有 AmazonS3Client 和 AmazonGlacierClient 对象,针对便携式类库(PCL)的适用于 .NET 的 Amazon SDK版本会将
Timeout设置为最大值。
以下示例说明如何指定标准重试模式、最多 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 适用于 .NET 的 Amazon SDK that target .NET Core. ReadWriteTimeout = TimeSpan.FromSeconds(10), RetryMode = RequestRetryMode.Standard, MaxErrorRetry = 3 });