A espera exponencial (em inglês) é uma estratégia de tratamento de erros padrão para aplicativos de rede em que um cliente repete periodicamente uma solicitação com falha com atrasos crescentes entre as solicitações. Os clientes precisam usar a espera exponencial para todas as solicitações ao Memorystore para Redis que retornam erros de código de resposta HTTP 5xx
e 429
.
Entender como funciona a espera exponencial é importante se você estiver:
criando aplicativos cliente que usam diretamente a API REST do Memorystore para Redis;
acessando o Memorystore para Redis por meio de uma biblioteca de cliente. Observe que algumas bibliotecas de cliente, como a Biblioteca de cliente do Memorystore para Redis para Node.js, têm espera exponencial integrada.
Se você estiver usando o console do Google Cloud, ele enviará solicitações ao Memorystore para Redis em seu nome e processará qualquer espera necessária.
Exemplo de algoritmo
Um algoritmo de retirada exponencial repete solicitações exponencialmente, aumentando o tempo de espera entre novas tentativas até um tempo máximo de retirada. Veja o exemplo a seguir:
Faça uma solicitação ao Memorystore para Redis.
Se a solicitação falhar, aguarde 1 +
random_number_milliseconds
segundos e repita a solicitação.Se a solicitação falhar, aguarde 2 +
random_number_milliseconds
segundos e repita a solicitação.Se a solicitação falhar, aguarde 4 +
random_number_milliseconds
segundos e repita a solicitação.E assim por diante, até um tempo
maximum_backoff
.Continue aguardando e tentando novamente até um número máximo de novas tentativas, sem aumentar o tempo de espera entre elas.
em que:
O tempo de espera é min(((2^
n
)+random_number_milliseconds
),maximum_backoff
), comn
incrementado em 1 para cada iteração (solicitação);random_number_milliseconds
é um número aleatório de milissegundos menor ou igual a 1.000. Isso ajuda a evitar casos em que muitos clientes são sincronizados por alguma situação e todos tentam novamente ao mesmo tempo, enviando solicitações em ondas sincronizadas. O valor derandom_number_milliseconds
precisa ser recalculado após cada nova solicitação.maximum_backoff
costuma ser 32 ou 64 segundos. O valor adequado depende do caso de uso.
Não há problema em continuar tentando novamente quando o tempo maximum_backoff
for atingido.
Depois disso, as novas tentativas não precisam continuar aumentando o tempo de retirada. Por exemplo, se um cliente usar um tempo maximum_backoff
de 64 segundos, depois de atingir esse valor, o cliente poderá tentar novamente a cada 64 segundos. Em algum momento, os clientes precisam ser impedidos de tentar novamente infinitas vezes.
A espera máxima e o número máximo de novas tentativas que um cliente usa depende do caso de uso e das condições da rede. Por exemplo, clientes móveis de um aplicativo podem precisar fazer mais novas tentativas e por intervalos maiores quando comparados a clientes desktop do mesmo aplicativo.
Se as solicitações de repetição falharem depois de exceder o número máximo de tentativas, informe ou registre um erro usando um dos métodos listados em Como receber suporte.