Pular para conteúdo

Novas Tentativas, Backoff e Deadlines

Uma nova tentativa ocorre após uma falha considerada transitória. Ela não corrige entrada inválida, violação de invariante, falta de autorização ou dependência continuamente sobrecarregada. Como consome capacidade adicional, deve ser limitada.

Classifique antes de repetir

Repita somente falhas cujo contrato admita sucesso posterior: falhas de conexão selecionadas, indisponibilidade temporária ou respostas explícitas de rate limit. Considere também se a tentativa anterior pode ter confirmado um efeito. Use idempotência quando um resultado ambíguo puder duplicar trabalho.

Primeiro, o deadline total

Um timeout por tentativa limita uma chamada. Um deadline limita a operação completa, incluindo fila, tentativas e esperas. Cada tentativa recebe apenas o orçamento restante. Pare quando o sucesso chegaria tarde demais e propague cancelamento.

Backoff exponencial limitado com jitter

Sem jitter, clientes que falham juntos repetem juntos. Uma política de jitter completo escolhe uniformemente entre zero e o valor exponencial limitado, sem incluí-lo:

static Duration retryDelay(int retryIndex, Duration base, Duration cap,
                           RandomGenerator random) {
    if (retryIndex < 0 || base.isNegative() || base.isZero() || cap.isNegative()) {
        throw new IllegalArgumentException();
    }
    long baseMillis = base.toMillis();
    long capMillis = cap.toMillis();
    long shift = Math.min(retryIndex, 30);
    long exponential;
    try {
        exponential = Math.multiplyExact(baseMillis, 1L << shift);
    } catch (ArithmeticException overflow) {
        exponential = Long.MAX_VALUE;
    }
    long upperExclusive = Math.min(capMillis, exponential);
    return upperExclusive <= 0
            ? Duration.ZERO
            : Duration.ofMillis(random.nextLong(upperExclusive));
}

Evite multiplicação

Se três camadas fizerem três tentativas, uma requisição pode causar 27 chamadas. Escolha uma camada com contexto semântico, limite tentativas ou orçamento, respeite orientações confiáveis do servidor e limite concorrência. Circuit breaker ou rate limit resolve outro problema.

Teste falhas transitórias e permanentes, conclusão ambígua, deadline, cancelamento, limites do jitter, Retry-After e recuperação. Observe tentativas, resultados, espera e orçamento esgotado sem registrar segredos.