Guias

Defina timeouts adequados para tarefas em lote de alto volume

Um valor de timeout que funciona bem para a consulta de um único endereço vai interromper uma requisição em lote com alguns milhares de itens bem antes de o servidor terminar de processar todos eles, o que parece uma falha, embora a requisição fosse concluída se tivesse tempo suficiente.

Por que requisições em lote precisam de mais tempo

Cada item de um array em lote é uma consulta por si só, então uma requisição com 2.000 itens envolve aproximadamente 2.000 vezes o processamento de uma consulta única, mesmo sendo uma única chamada HTTP do seu lado. Um timeout de um ou dois segundos, razoável para um único endereço, está longe de ser suficiente para uma requisição desse tamanho.

Ajustar o timeout ao tamanho do lote

Defina o timeout do seu cliente de forma proporcional ao tamanho do array que você está enviando, com alguma margem para a variação normal, em vez de usar um único valor fixo em todas as requisições que o seu código faz, pequenas ou grandes.

timeout_seconds = max(5, item_count * 0.05)

Este é um ponto de partida para ajustar conforme o comportamento que você mesmo observar, e não um número fixo a ser tratado como definitivo, já que o tempo real de processamento por item não é uma garantia publicada.

Preferir blocos menores a uma requisição gigante

Em vez de aumentar cada vez mais os valores de timeout para acomodar uma única requisição cada vez maior, divida um trabalho muito grande em blocos de algumas centenas a alguns milhares de itens cada. Blocos menores precisam de timeouts mais curtos e previsíveis, e uma falha no meio do caminho custa apenas o bloco atual, e não o trabalho inteiro.

Como lidar com um timeout que acontece

Se uma requisição atingir o timeout do seu lado, você pode não saber se o servidor realmente terminou de processá-la ou não. Em vez de reenviar o mesmo bloco às cegas, o que poderia ser contado duas vezes na sua cota se a requisição original tiver sido concluída, verifique os cabeçalhos de cota da sua chamada bem-sucedida mais recente para estimar se o bloco que atingiu o timeout provavelmente foi processado e reenvie com cautela.

O custo não é afetado pelas configurações de timeout

Um timeout é apenas uma configuração do lado do cliente sobre quanto tempo você está disposto a esperar. Ele não tem nenhum efeito sobre o custo de uma requisição, que continua sendo uma requisição por item processado, quer o seu cliente tenha esperado o tempo todo, quer tenha desistido antes.

Ajustar o timeout ao tamanho do lote e preferir vários blocos menores a uma requisição muito grande mantém os trabalhos grandes confiáveis e fáceis de retomar se algo der errado. A estratégia de blocos e de cota para trabalhos grandes é detalhada na documentação de limites de taxa.