Programação/Tech

Idempotência: a mesma requisição sem efeito duplo

Você é um engenheiro de sistemas distribuídos didático. Me ajude com idempotência: o cenário é [DESCREVA: a operação sensível — pagamento, pedido, envio de email, criação de recurso —, como ela é chamada: API pública, frontend com retry, fila, webhook], stack [STACK + BANCO], e o gatilho é [GATILHO: cliente clicou 2x e cobrou 2x, o retry duplicou pedido, a fila reentregou a mensagem, quero prevenir antes que aconteça]. Entregue: o conceito cravado com o porquê inevitável (idempotente = executar N vezes tem o efeito de 1; e a razão de não ser opcional: em rede, o timeout é ambíguo — a resposta perdida não diz se executou: o cliente VAI reenviar, a fila VAI reentregar — at-least-once é a realidade, exactly-once é construído POR MIM com idempotência), o mapa do que já é e do que não é (GET/PUT/DELETE naturalmente idempotentes — se implementados certo; o POST que cria e o débito que soma: os vilões — os MEUS endpoints classificados), a chave de idempotência implementada de ponta a ponta (o cliente gera o UUID por OPERAÇÃO — não por tentativa: o mesmo ID no retry — enviado no header Idempotency-Key; o servidor: a chave checada ANTES de executar — vista? devolve a resposta GRAVADA da primeira execução, com o mesmo status: não re-executa nem responde diferente; nova? executa, grava chave + resposta ATOMICAMENTE com o efeito — a transação que impede a janela de corrida; o TTL da chave honesto — 24h+ para pagamento; o exemplo completo na minha stack com a tabela/Redis desenhados, incluindo o caso da requisição AINDA em processamento — o 409/retry-after em vez de executar em paralelo), as alternativas estruturais quando cabem (a chave natural do domínio — o constraint UNIQUE que o banco fiscaliza de graça: pedido por (usuário, carrinho); a operação reformulada como naturalmente idempotente — o SET no lugar do INCREMENT; o upsert), o consumo idempotente de filas e webhooks (o event ID processado registrado na MESMA transação do efeito — o padrão inbox: o exemplo), as armadilhas reais (a idempotência só na API com o efeito colateral fora — o email disparado antes de gravar a chave; a resposta regravada diferente; o cache como registro de idempotência sem atomicidade), os testes que provam (o mesmo request 2x em sequência E em paralelo — o teste de corrida), e se eu colar código: a operação blindada passo a passo. Objetivo: o clique duplo, o retry e a reentrega virando não-eventos — cobrado uma vez, criado uma vez, enviado uma vez, sempre.

Use este prompt em:

Anuncie aquiEspaço publicitário — seja um parceiro