Reintentos y tiempos de espera - AWS SDK para .NET (V3)

¡Se AWS SDK para .NET ha publicado la versión 4 (V4) del!

Para empezar a usar la nueva versión del SDK, consulte la Guía para desarrolladores de AWS SDK para .NET (versión 4), especialmente el tema Migración a la versión 4.

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Reintentos y tiempos de espera

AWS SDK para .NET permite configurar el número de reintentos y los valores de tiempo de espera de las solicitudes HTTP relativas a servicios de AWS. Si los valores predeterminados de los reintentos y los tiempos de espera no son adecuados para su aplicación, puede ajustarlos para sus requisitos específicos, pero es importante comprender cómo afectará hacer esto al comportamiento de su aplicación.

Para determinar qué valores usar para los reintentos y los tiempos de espera, tenga en cuenta lo siguiente:

  • ¿Cómo deben responder AWS SDK para .NET y la aplicación cuando la conectividad de red se degrade o no se pueda tener acceso a un servicio de AWS? ¿Desea que la llamada fracase rápidamente o es adecuado que la llamada se siga reintentando en su nombre?

  • ¿Es su aplicación una aplicación o sitio web que se orienta a los usuarios y que debe tener capacidad de respuesta, o se trata de una tarea de procesamiento en segundo plano con una mayor tolerancia de las latencias más elevadas?

  • ¿La aplicación está implementada en una red fiable con baja latencia o en una ubicación remota con una conectividad poco fiable?

Reintentos

Descripción general

AWS SDK para .NET reintentará las solicitudes con errores producidos por la limitación controlada del lado del servidor o por conexiones perdidas. Hay dos propiedades de las clases de configuración de servicios que se pueden usar para especificar el comportamiento de reintento de un cliente de servicio. Las clases de configuración de servicios heredan estas propiedades de la clase abstracta Amazon.Runtime.ClientConfig de la Referencia de API de AWS SDK para .NET:

  • RetryMode especifica uno de los tres modos de reintento, que se definen en la enumeración Amazon.Runtime.RequestRetryMode.

    El valor predeterminado de la aplicación se puede controlar mediante la variable de entorno AWS_RETRY_MODE o la configuración retry_mode del archivo de configuración AWS compartido.

  • MaxErrorRetry especifica el número de reintentos permitidos en el nivel del cliente de servicio; SDK vuelve a intentar la operación el número de veces especificado antes de generar un error y lanzar una excepción.

    El valor predeterminado de la aplicación se puede controlar mediante la variable de entorno AWS_MAX_ATTEMPTS o la configuración max_attempts del archivo de configuración AWS compartido.

Encontrará descripciones detalladas de estas propiedades en la clase abstracta Amazon.Runtime.ClientConfig de la Referencia de API de AWS SDK para .NET. Cada valor de RetryMode se corresponde de forma predeterminada con un valor concreto de MaxErrorRetry, como se muestra en la siguiente tabla.

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

Comportamiento

Cuando la aplicación se inicia

Cuando la aplicación se inicia, SDK configura los valores predeterminados de RetryMode y MaxErrorRetry. Estos valores predeterminados se utilizarán cuando cree un cliente de servicio, a menos que especifique otros valores.

  • Si las propiedades no están configuradas en el entorno, el valor predeterminado de RetryMode se configura como Heredado y el valor predeterminado de MaxErrorRetry se configura con el valor correspondiente de la tabla anterior.

  • Si el modo de reintento está configurado en el entorno, ese valor se utiliza como valor predeterminado de RetryMode. El valor predeterminado de MaxErrorRetry se configura con el valor correspondiente de la tabla anterior, a menos que el valor de máximo de errores también esté configurado en el entorno (se describe a continuación).

  • Si el valor de máximo de errores está configurado en el entorno, ese valor se utiliza como valor predeterminado de MaxErrorRetry. Amazon DynamoDB es la excepción a esta regla; el valor de DynamoDB predeterminado de MaxErrorRetry es siempre el valor de la tabla anterior.

Mientras la aplicación se ejecuta

Al crear un cliente de servicio, puede usar los valores predeterminados de RetryMode y MaxErrorRetry, tal y como se ha explicado anteriormente, o bien puede especificar otros valores. Para especificar otros valores, cree e incluya un objeto de configuración de servicio, como AmazonDynamoDBConfig o AmazonSQSConfig, al crear el cliente de servicio.

Una vez creado el servicio de cliente, estos valores no podrán modificarse.

Consideraciones

Cuando se produce un reintento, aumenta la latencia de la solicitud. Debe configurar sus reintentos según los límites de su aplicación para la latencia de solicitudes total y las tasas de error.

Tiempos de espera

AWS SDK para .NET le permite configurar los tiempos de espera de las solicitudes en el nivel del cliente del servicio y por llamada a cada método. Existen dos mecanismos para configurar los tiempos de espera, que se describen en las secciones siguientes:

Uso del parámetro CancellationToken para los tiempos de espera

AWS SDK para .NET permite configurar los tiempos de espera de las solicitudes en llamadas asíncronas mediante el parámetro CancellationToken. El siguiente fragmento de código muestra un ejemplo. El código genera una excepción System.Threading.Tasks.TaskCanceledException si la solicitud no se completa en 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); }

Uso de las propiedades Timeout y ReadWriteTimeout para los tiempos de espera

nota

La propiedad Timeout no afecta a las llamadas asíncronas. Si utiliza llamadas asíncronas, consulte Uso del parámetro CancellationToken para los tiempos de espera en su lugar.

AWS SDK para .NET permite configurar los valores de tiempo de espera de la solicitud o de tiempo de espera de lectura/escritura del socket en el nivel de cliente del servicio. Estos valores se especifican en las propiedades Timeout y ReadWriteTimeout de la clase abstracta Amazon.Runtime.ClientConfig. Estos valores se pasan como las propiedades Timeout y ReadWriteTimeout de los objetos HttpWebRequestcreados por el objeto de cliente de servicio de AWS. De forma predeterminada, el valor Timeout es de 100 segundos y el valor ReadWriteTimeout es de 300 segundos.

Cuando su red tiene una elevada latencia o existen condiciones que hacen que se reintente una operación, el uso de valores de tiempo de espera largo y un elevado número de reintentos pueden hacer que algunas operaciones del SDK parezcan no tener capacidad de respuesta.

nota

La versión del AWS SDK para .NET que tiene como destino la biblioteca de clases portable (PCL) usa la clase HttpClient en lugar de la clase HttpWebRequest y admite únicamente la propiedad Timeout.

A continuación, se indican las excepciones sobre los valores de tiempo de espera predeterminados. Estos valores se invalidan al establecer de forma explícita los valores de tiempo de espera.

En el siguiente ejemplo se muestra cómo especificar el modo de reintento Estándar, un máximo de 3 reintentos, un tiempo de espera de 10 segundos y un tiempo de espera de lectura/escritura de 10 segundos (si procede). Al constructor AmazonS3Client se le asigna un 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 });