Espera exponencial

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:

Se você estiver usando o console do Google Cloud, ele enviará solicitações para o 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:

  1. Faça uma solicitação ao Memorystore para Redis.

  2. Se a solicitação falhar, aguarde 1 + random_number_milliseconds segundos e repita a solicitação.

  3. Se a solicitação falhar, aguarde 2 + random_number_milliseconds segundos e repita a solicitação.

  4. Se a solicitação falhar, aguarde 4 + random_number_milliseconds segundos e repita a solicitação.

  5. E assim por diante, até um tempo maximum_backoff.

  6. Continue aguardando e tentando novamente até um número máximo de novas tentativas, sem aumentar o tempo de espera entre elas.

onde:

  • O tempo de espera é min(((2^n)+random_number_milliseconds), maximum_backoff), com n 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 de random_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.