Idempotência
Explicamos nosso esquema de idempotência para evitar a criação de dois ou mais recursos para a mesma solicitação.
Como uma solicitação HTTP pode dar timeout, precisamos garantir que, ao tentar novamente, o processamento ocorra apenas uma vez. Para isso, em cada solicitação, enviaremos um header x-idempotency-key
com um ID único que você deverá processar com um cache em memória (por exemplo: Redis).
No início de cada transação, você deve verificar se a chave de idempotência que enviamos já está no cache em memória e, dependendo de sua presença ou não, você deverá realizar o seguinte:
O header de idempotência não existe no cache
Você deverá armazenar no cache em memória a relação chave de idempotência → pedido, com um estado em trânsito e um TTL de 3 minutos.
Quando aprovar ou rejeitar a transação, você deverá armazenar o resultado no cache e atualizar o estado da chave de idempotência para 'concluído'.
O header de idempotência já existe no cache
Em caso de uma solicitação duplicada, você deverá verificar o estado da transação no cache.
- Se estiver no estado concluído, você deverá responder com um código HTTP 200 e o body esperado para o endpoint, completando-o com o resultado do cache.
- Se estiver no estado em trânsito, você deverá responder com um código HTTP 425 (Too Early: RFC 8470) e o body esperado para o endpoint. Nós buscaremos a resposta dessa solicitação alguns milissegundos depois.
Requests em andamento
Se você receber uma segunda solicitação com o mesmo ID de idempotência e a primeira ainda estiver em andamento, você deverá responder com um http-status 425 e um body vazio.