A versão 4 (V4) do AWS SDK para .NET foi lançada!
Para começar a usar a nova versão do SDK, consulte o Guia do desenvolvedor AWS SDK para .NET (V4), especialmente o tópico sobre migração para a versão 4.
As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
Novas tentativas e tempos limite
O AWS SDK para .NET permite que você configure os valores do número de tentativas e do tempo limite para solicitações HTTP de serviços da AWS. Se os valores padrão para novas tentativas e tempos limite não forem apropriados, ajuste-os conforme os seus requisitos específicos, mas é importante entender como essa ação afetará o comportamento do aplicativo.
Para determinar quais valores usar para tentativas e tempos limite, considere o seguinte:
-
Como o AWS SDK para .NET e o seu aplicativo devem responder quando a qualidade da conexão com a rede piorar ou quando um serviço da AWS não estiver acessível? Deseja que a chamada falhe rapidamente, ou é apropriado que a chamada continue tentando em seu nome?
-
O seu aplicativo é um aplicativo ou site voltado para o usuário e que deve ser responsivo, ou ele é um trabalho de processamento em segundo plano com maior tolerância a latências?
-
O aplicativo é implantado em uma rede confiável com baixa latência ou é implantado em um local remoto com conectividade incerta?
Novas tentativas
Visão geral
O AWS SDK para .NET pode realizar novas tentativas para as solicitações que falharem devido ao controle de utilização no lado do servidor ou conexões perdidas. Há duas propriedades das classes de configuração de serviço que você pode usar para especificar o comportamento de novas tentativas de um cliente de serviço. As classes de configuração de serviço herdam essas propriedades da classe abstrata Amazon.Runtime.ClientConfig da Referência de API do AWS SDK para .NET:
-
RetryModeespecifica um dos três modos de novas tentativas, que foram definidos na enumeração do Amazon.Runtime.RequestRetryMode.O valor padrão do seu aplicativo pode ser controlado usando a variável de ambiente
AWS_RETRY_MODEou a configuração retry_mode no arquivo de configuração compartilhado da AWS.
-
MaxErrorRetryespecifica o número de novas tentativas permitidas no nível do cliente de serviço; o SDK executa novas tentativas da operação pelo número especificado de vezes antes de causar uma falha e gerar uma exceção.O valor padrão do seu aplicativo pode ser controlado usando a variável de ambiente
AWS_MAX_ATTEMPTSou a configuração max_attempts no arquivo de configuração compartilhado da AWS.
As descrições detalhadas dessas propriedades podem ser encontradas na classe Amazon.Runtime.ClientConfig abstrata da Referência de API do AWS SDK para .NET. Cada valor de RetryMode corresponde, por padrão, a um valor específico de MaxErrorRetry, conforme mostrado na tabela a seguir.
| RetryMode | Corresponding MaxErrorRetry (Amazon DynamoDB) | Corresponding MaxErrorRetry (all others) |
|---|---|---|
| Legacy | 10 | 4 |
| Standard | 10 | 2 |
| Adaptive (experimental) | 10 | 2 |
Comportamento
Quando seu aplicativo é iniciado
Quando seu aplicativo é iniciado, os valores padrão para RetryMode e MaxErrorRetry são configurados pelo SDK. Esses valores padrão são usados quando você cria um cliente de serviço, a menos que você especifique outros valores.
-
Se as propriedades não estiverem definidas em seu ambiente, o padrão para
RetryModeserá configurado como Legacy e o padrão paraMaxErrorRetryserá configurado com o valor correspondente da tabela anterior. -
Se o modo de novas tentativas tiver sido definido em seu ambiente, esse valor será usado como padrão para
RetryMode. O padrão paraMaxErrorRetryé configurado com o valor correspondente da tabela anterior, a menos que o valor para o máximo de erros também tenha sido definido em seu ambiente (descrito a seguir). -
Se o valor para o máximo de erros tiver sido definido em seu ambiente, esse valor será usado como padrão para
MaxErrorRetry. O Amazon DynamoDB é a exceção a essa regra; o valor padrão do DynamoDB paraMaxErrorRetryé sempre o valor da tabela anterior.
À medida que seu aplicativo é executado
Ao criar um cliente de serviço, você pode usar os valores padrão para RetryMode e MaxErrorRetry, conforme descrito anteriormente, ou pode especificar outros valores. Para especificar outros valores, crie e inclua um objeto de configuração do serviço, como AmazonDynamoDBConfig ou AmazonSQSConfig quando criar o cliente do serviço.
Não é possível alterar os valores de um cliente de serviço depois que ele tiver sido criado.
Considerações
Quando ocorre uma nova tentativa, a latência da solicitação é aumentada. Configure as tentativas com base nos limites de latência total da solicitação e taxas de erros do aplicativo.
Tempo limite
O AWS SDK para .NET possibilita que você configure os tempos limite de solicitação em nível de cliente de serviço e por chamada de método. Há dois mecanismos para configurar tempos limite, que serão abordados nas seções subsequentes:
-
Se você estiver usando chamadas assíncronas, poderá utilizar o parâmetro
CancellationTokendo método. -
Se você estiver usando chamadas síncronas no .NET Framework, poderá usar as propriedades
TimeouteReadWriteTimeoutda classe abstrata Amazon.Runtime.ClientConfig.
Usar o parâmetro CancellationToken para tempos limite
O AWS SDK para .NET permite que você configure os tempos limite de solicitação em chamadas assíncronas usando o parâmetro CancellationToken. O trecho de código a seguir mostra um exemplo. O código lançará System.Threading.Tasks.TaskCanceledException se a solicitação não for concluída em 10 segundos.
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); }
Usar as propriedades Timeout e ReadWriteTimeoutpara tempos limite
nota
A propriedade Timeout não afeta as chamadas assíncronas. Se você estiver usando chamadas assíncronas, consulte Usar o parâmetro CancellationToken para tempos limite em vez disso.
O AWS SDK para .NET permite que você configure os valores do tempo limite da solicitação e o tempo limite de leitura/gravação do soquete no nível do cliente do serviço. Esses valores são especificados nas propriedades Timeout e ReadWriteTimeout da classe abstrata Amazon.Runtime.ClientConfig. Esses valores são transmitidos como as propriedades Timeout e ReadWriteTimeout dos objetos HttpWebRequestTimeout é 100 segundos e o valor ReadWriteTimeout é 300 segundos.
Quando a sua rede estiver com latência alta, ou existirem condições que gerem uma nova tentativa para uma operação, utilizar valores de tempo limite longos e um alto número de tentativas pode fazer com que algumas operações do SDK pareçam indiferentes.
nota
A versão do AWS SDK para .NET que aponta para a biblioteca de classes portátil (PCL) usa a classe HttpClientHttpWebRequest e oferece suporte apenas à propriedade Timeout
Veja a seguir as exceções aos valores de tempo limite padrão. Estes valores são substituídos ao definir explicitamente os valores de tempo limite.
-
TimeouteReadWriteTimeoutsão definidos com os valores máximos se o método chamado faz upload de um stream, como AmazonS3Client.PutObjectAsync(), AmazonS3Client.UploadPartAsync(), AmazonGlacierClient.UploadArchiveAsync() e assim por diante. -
As versões do AWS SDK para .NET que apontam para o .NET Framework definem
TimeouteReadWriteTimeoutcomo os valores máximos para todos os objetos do AmazonS3Client e AmazonGlacierClient. -
As versões do AWS SDK para .NET que apontam para a biblioteca de classes portátil (PCL) e .NET Core definem
Timeoutcom o valor máximo para todos os objetos do AmazonS3Client e AmazonGlacierClient.
O exemplo a seguir mostra como especificar o modo de novas tentativas padrão, um máximo de três tentativas, um tempo limite de 10 segundos e um tempo limite de leitura/gravação de 10 segundos (se aplicável). O construtor AmazonS3Client recebe um objeto AmazonS3Config.
var s3Client = new AmazonS3Client( new AmazonS3Config { Timeout = TimeSpan.FromSeconds(10), // NOTE: The following property is obsolete for // versions of the AWS SDK para .NET that target .NET Core. ReadWriteTimeout = TimeSpan.FromSeconds(10), RetryMode = RequestRetryMode.Standard, MaxErrorRetry = 3 });