

O AWS SDK para JavaScript v2 chegou ao fim do suporte. Recomendamos migrar para o [AWS SDK para JavaScript v3](https://docs.aws.amazon.com//sdk-for-javascript/v3/developer-guide/). Para ver detalhes e informações sobre como migrar, consulte este [anúncio](https://aws.amazon.com/blogs//developer/announcing-end-of-support-for-aws-sdk-for-javascript-v2/).

# Estratégia de repetição no AWS SDK para JavaScript v2
<a name="retry-strategy"></a>

Vários componentes em uma rede, como servidores DNS, switches, balanceadores de carga e outros, podem gerar erros em qualquer lugar do ciclo de vida de determinada solicitação. A técnica usual para lidar com essas respostas de erro em um ambiente de rede é implementar novas tentativas no aplicativo cliente. Essa técnica aumenta a confiabilidade da aplicação e reduz os custos operacionais para o desenvolvedor. Os AWS SDKs implementam uma lógica de repetição automática para as solicitações da AWS.

## Comportamento de repetição baseado em recuo exponencial
<a name="retry-behavior"></a>

O AWS SDK para JavaScript v2 implementa a lógica de repetição usando [recuo exponencial com instabilidade total](https://aws.amazon.com/builders-library/timeouts-retries-and-backoff-with-jitter/#Jitter) para melhor controle de fluxo. A ideia por trás do recuo exponencial é usar esperas progressivamente mais longas entre as novas tentativas para respostas de erro consecutivas. A instabilidade (atraso aleatório) é usada para evitar colisões sucessivas. 

### Testar o atraso de repetição na v2
<a name="w2aac18c37b5b5"></a>

Para testar o atraso de repetição na v2, o código em [node\$1modules/aws-sdk/lib/event\$1listeners.js](https://github.com/aws/aws-sdk-js/blob/master/lib/event_listeners.js#L588) foi atualizado em `console.log` para exibir o valor presente na variável de atraso da seguinte forma: 

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

#### Atrasos de repetição com a configuração padrão
<a name="w2aac18c37b5b5b7"></a>

É possível testar o atraso para qualquer operação em clientes do AWS SDK. Chamamos a operação `listTables` em um cliente do DynamoDB usando o seguinte código:

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

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

Para testar as repetições, simulamos `NetworkingError` desconectando a internet do dispositivo que executa o código de teste. Também é possível configurar o proxy para retornar um erro personalizado.

Ao executar o código, você pode ver esse atraso na repetição usando o recuo exponencial com instabilidade da seguinte forma:

```
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 a repetição usa instabilidade, você obterá valores diferentes na execução do código de exemplo.

#### Repetir atrasos com uma base personalizada
<a name="w2aac18c37b5b5b9"></a>

O AWS SDK para JavaScript v2 permite passar um número base personalizado de milissegundos para usar no recuo exponencial para repetições de operação. O padrão é 100 ms para todos os serviços, exceto para o DynamoDB, onde o padrão é 50 ms.

Testamos repetições com uma base personalizada de 1.000 ms da seguinte forma:

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

Simulamos `NetworkingError` desconectando a internet do dispositivo que executa o código de teste. É possível ver que os valores de atraso de repetição são maiores em comparação com a execução anterior, em que o padrão era 50 ms ou 100 ms.

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

Como a repetição usa instabilidade, você obterá valores diferentes na execução do código de exemplo.

#### Atrasos de repetição com algoritmo de recuo personalizado
<a name="w2aac18c37b5b5c11"></a>

O AWS SDK para JavaScript v2 também permite passar uma função de recuo personalizada que aceita uma contagem de repetições e erro, e retorna a quantidade de tempo de atraso em milissegundos. Se o resultado for um valor negativo diferente de zero, nenhuma outra tentativa de repetição será feita.

Testamos a função de recuo personalizada que usa recuo linear com valor base de 200 ms da seguinte forma:

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

Simulamos `NetworkingError` desconectando a internet do dispositivo que executa o código de teste. É possível ver que os valores do atraso de repetição são múltiplos de 200.

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