Tornando as retentativas seguras
Em sistemas reais, falhas em requisições de API são comuns. Talvez ocorra um timeout de rede. Talvez seu serviço caia logo após enviar uma requisição. Nesses casos, é natural tentar novamente, mas como você pode ter certeza de que o Midaz não processará a mesma operação duas vezes? É aí que as chaves de idempotência entram em ação. Ao anexar uma chave única a cada requisição, você está dizendo ao Midaz: “Esta é a mesma operação. Se você já a processou, não faça novamente.” O Midaz armazena essa chave temporariamente e a utiliza para determinar se a requisição é nova, já foi concluída ou ainda está sendo processada. Isso protege seu sistema contra duplicatas enquanto oferece controle total sobre sua estratégia de retentativa.Idempotência no Midaz
O Midaz usa chaves de idempotência para garantir que as operações sejam seguras para retentativa e nunca processadas mais de uma vez. Para isso, sua requisição deve incluir dois headers:
X-Idempotency: a chave única que identifica a requisição.X-TTL: o tempo de vida (em segundos) que o Midaz deve armazenar essa chave em cache.
- Quando uma nova chave chega, o Midaz a marca como
pending, processa a requisição e armazena a resposta completa em cache. - Se a mesma chave for usada novamente dentro da janela de TTL:
- Se a operação ainda estiver em execução, o Midaz retorna um
409 ConflictcomX-Idempotency-Replayed: false. - Se estiver concluída, o Midaz retorna exatamente a mesma resposta, incluindo headers e corpo, com
X-Idempotency-Replayed: true.
- Se a operação ainda estiver em execução, o Midaz retorna um
Resumo do fluxo
A Figura 1 mostra o ciclo de vida completo de uma requisição idempotente:
- Se a requisição não incluir uma chave de idempotência existente, o Midaz cria uma nova, processa a requisição, armazena a resposta e a retorna com
X-Idempotency-Replayed: false. - Se a chave já existir:
- Se a operação ainda estiver em execução, o Midaz retorna um
409 ConflictcomX-Idempotency-Replayed: false. - Se a operação estiver concluída, o Midaz ignora a execução e retorna a resposta em cache com
X-Idempotency-Replayed: true.
- Se a operação ainda estiver em execução, o Midaz retorna um
Exemplo de requisição
Veja como enviar uma requisição idempotente para criar uma transação:Geração de chaves
Você gera a chave
X-Idempotency do seu lado. A chave deve ser determinística, ou seja, se a mesma operação for retentada, a chave permanece a mesma.
Uma estratégia simples e eficaz é criar um hash baseado nos campos-chave que definem a operação. Por exemplo:
- Valor da transação
- Origem e destino
- Código do asset
Prevenindo duplicação de entidades
Para alguns endpoints, você não precisa de chaves de idempotência para evitar duplicação. O Midaz aplica restrições de unicidade em recursos críticos como Contas e Ledgers. Se você tentar criar uma entidade com um nome que já existe, o sistema bloqueia a requisição e retorna um erro descritivo. Isso garante que seus dados permaneçam limpos, sem ambiguidade e fáceis de gerenciar, mesmo quando vários serviços estão operando em paralelo ou quando retentativas ocorrem automaticamente.
FAQ
O que acontece se eu não enviar uma chave de idempotência?
O que acontece se eu não enviar uma chave de idempotência?
O Midaz trata a requisição como nova toda vez. Isso significa que retentativas podem resultar em operações duplicadas.
Posso reutilizar uma chave entre endpoints?
Posso reutilizar uma chave entre endpoints?
Não. As chaves devem ser restritas a uma única operação e endpoint.
O que acontece se eu alterar o TTL em uma retentativa?
O que acontece se eu alterar o TTL em uma retentativa?
Apenas o TTL da primeira requisição é utilizado. Alterá-lo depois não tem efeito.
A resposta repetida será sempre idêntica?
A resposta repetida será sempre idêntica?
Sim. O Midaz repete a resposta completa, incluindo headers e corpo, para requisições concluídas.
Qual é o TTL padrão se eu não enviar X-TTL?
Qual é o TTL padrão se eu não enviar X-TTL?
A janela padrão é de 300 segundos (5 minutos), mas você pode personalizá-la até o limite permitido por endpoint.

