

La versión 2 de AWS SDK para JavaScript ha llegado al final del soporte. Se recomienda que migre a [AWS SDK para JavaScript v3](https://docs.aws.amazon.com//sdk-for-javascript/v3/developer-guide/). Para ver detalles e información adicionales sobre cómo realizar la migración, consulte este [anuncio](https://aws.amazon.com/blogs//developer/announcing-end-of-support-for-aws-sdk-for-javascript-v2/).

# Estrategia de reintentos en la versión 2 de AWS SDK para JavaScript
<a name="retry-strategy"></a>

Numerosos componentes de una red, como los servidores DNS, los conmutadores o los balanceadores de carga, entre otros, pueden generar errores en cualquier punto de la vida de una solicitud determinada. La técnica habitual para abordar estas respuestas de error en un entorno de red consiste en implementar los reintentos en la aplicación cliente. Esta técnica aumenta la fiabilidad de la aplicación y reduce los costos operativos para el desarrollador. AWS Los SDK implementan una lógica de reintentos automatizados para las solicitudes de AWS.

## Comportamiento de reintentos basado en el retroceso exponencial
<a name="retry-behavior"></a>

La versión 2 de AWS SDK para JavaScript implementa la lógica de reintentos mediante el [retroceso exponencial con fluctuación completa](https://aws.amazon.com/builders-library/timeouts-retries-and-backoff-with-jitter/#Jitter) para obtener un mejor control del flujo. El retardo exponencial se basa en la idea de utilizar tiempos de espera progresivamente más largos entre reintentos para las respuestas a errores consecutivos. La fluctuación (retardo aleatorio) se utiliza para evitar colisiones sucesivas. 

### Prueba del retardo de reintentos en la versión 2
<a name="w2aac18c37b5b5"></a>

Para probar el retardo de reintentos en la versión 2, se ha actualizado el código en [node\$1modules/aws-sdk/lib/event\$1listeners.js](https://github.com/aws/aws-sdk-js/blob/master/lib/event_listeners.js#L588) en `console.log` al valor presente en la variable delay de la siguiente manera: 

```
// 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();
}
```

#### Retardos de reintentos con la configuración predeterminada
<a name="w2aac18c37b5b5b7"></a>

Puede probar el retardo de cualquier operación en los clientes del SDK de AWS. Llamamos a la operación `listTables` en un cliente de DynamoDB con el siguiente código:

```
import AWS from "aws-sdk";

const region = "us-east-1";
const client = new AWS.DynamoDB({ region });
await client.listTables({}).promise();
```

Para probar los reintentos, simulamos `NetworkingError` mediante la desconexión de Internet del dispositivo que ejecuta el código de prueba. También puede configurar el proxy para que devuelva un error personalizado.

Al ejecutar el código, puede ver que el retardo de reintentos mediante el retroceso exponencial con fluctuación es como sigue:

```
retry delay: 7.39361151766359
retry delay: 9.0672860785882
retry delay: 134.89340825668168
retry delay: 398.53559817403965
retry delay: 523.8076165896343
retry delay: 1323.8789643058465
```

Como el reintento utiliza la fluctuación, obtendrá valores diferentes en la ejecución del código de ejemplo.

#### Retardos de reintentos con base personalizada
<a name="w2aac18c37b5b5b9"></a>

La versión 2 de AWS SDK para JavaScript permite pasar un número base personalizado de milisegundos para utilizarlo en el retroceso exponencial para los reintentos de la operación. Está predeterminado a 100 ms para todos los servicios excepto DynamoDB, donde está predeterminado a 50 ms.

Probamos los reintentos con una base personalizada de 1000 ms de la siguiente manera:

```
...
const client = new AWS.DynamoDB({ region, retryDelayOptions: { base: 1000 } });
...
```

Simulamos `NetworkingError` mediante la desconexión de Internet del dispositivo que ejecuta el código de prueba. Puede ver que los valores para el retardo de reintentos son más altos en comparación con la ejecución anterior, en la que el valor predeterminado era de 50 o 100 ms.

```
retry delay: 356.2841549924913
retry delay: 1183.5216495444615
retry delay: 2266.997988094194
retry delay: 1244.6948354966453
retry delay: 4200.323030066383
```

Como el reintento utiliza la fluctuación, obtendrá valores diferentes en la ejecución del código de ejemplo.

#### Retardos de reintentos con algoritmo de retroceso personalizado
<a name="w2aac18c37b5b5c11"></a>

La versión 2 de AWS SDK para JavaScript también permite pasar una función de retroceso personalizada que acepta un recuento de reintentos y un error y devuelve la cantidad de tiempo que se retrasará en milisegundos. Si el resultado es un valor negativo distinto de cero, no se realizarán más intentos de reintentos.

Probamos la función de retroceso personalizada que utiliza el retroceso lineal con un valor base de 200 ms de la siguiente manera:

```
...
const client = new AWS.DynamoDB({
  region,
  retryDelayOptions: { customBackoff: (count, error) => (count + 1) * 200 },
});
...
```

Simulamos `NetworkingError` mediante la desconexión de Internet del dispositivo que ejecuta el código de prueba. Puede ver que los valores para el retardo de reintentos son múltiplos de 200.

```
retry delay: 200
retry delay: 400
retry delay: 600
retry delay: 800
retry delay: 1000
```