Pular para o conteúdo

Idempotência e Novas Tentativas

Toda chamada de tempo real deve carregar um Idempotency-Key. Não é uma cortesia de limite de taxa — é o que torna uma nova tentativa segura. As redes falham depois que o fornecedor já foi acionado; sem uma chave, a única forma de descobrir se uma verificação foi executada é executá-la de novo e pagar por ela duas vezes.

Envie um valor que você consiga regenerar: um UUID, um ID de pedido ou um hash do trabalho que você está fazendo. O servidor o restringe à sua conta, então dois usuários não podem colidir.

Mesma chavePayloadResultado
Chave novaqualquerExecuta normalmente, com cobrança
Mesma chaveidênticoA resposta armazenada é retornada; replayed=true. Nenhuma cobrança nova.
Mesma chavediferente409 idempotency_conflict — uma chave fica vinculada ao payload que carregou primeiro
Mesma chaveidêntico, primeira chamada ainda em execução409 request_in_progress com Retry-After

Idempotency-Key é limitado a 191 bytes e os registros de reprodução são mantidos por 30 dias por padrão.

Eles parecem semelhantes em uma resposta e significam coisas diferentes:

CampoOndeSignifica
replayednível superiorEsta chamada nunca chegou a um fornecedor — você reproduziu uma chave.
cacheddentro de cada resultadoO veredito deste produto veio do cache de resultados.

Uma chamada reproduzida devolve a resposta original, incluindo o valor de cached de cada entrada. Nenhum dos dois sinalizadores altera o que foi cobrado: uma reprodução nunca movimenta dinheiro, e um acerto de cache continua sendo cobrado pelo preço por verificação do produto.

Apenas resultados liquidados são armazenados como fatos. Resultados com falha e unknown não são armazenados em cache — uma verificação posterior do mesmo identificador no mesmo produto consultará o fornecedor de novo em vez de reproduzir uma resposta inconclusiva.

O que você viuO que fazer
Timeout, ou HTTP 500Reenvie o corpo original com a chave original. O resultado é incerto; é para este caso que a chave existe.
409 request_in_progressAguarde Retry-After e então reenvie o mesmo corpo com a mesma chave.
409 idempotency_conflictA chave já carrega um payload diferente. Gere uma nova chave — não edite o corpo e reutilize a antiga.
429 realtime_rate_limitedAguarde Retry-After. Nada foi enviado, então a mesma chave ainda está livre e é seguro enviá-la.
503 realtime_route_unavailableNada foi enviado. Tente novamente mais tarde, com a mesma chave.

A única coisa que você nunca deve fazer após um timeout é enviar uma chave nova com o mesmo trabalho: se a primeira chamada chegou, você acabou de pagar duas vezes pela verificação.

HTTPcode
400idempotency_key_required — cabeçalho ausente
409request_in_progress — a chamada original ainda está em execução
409idempotency_conflict — a chave foi usada pela primeira vez com um payload diferente