Tornando as novas tentativas seguras
Requisições de API que falham são comuns. Ocorre um timeout de rede, ou seu serviço cai logo depois de enviar uma requisição. Repetir é natural, e você precisa ter certeza de que o Midaz não vai processar a mesma operação duas vezes. Ao anexar uma chave única a cada requisição, você está dizendo ao Midaz: “Esta é a mesma operação. Se você já processou, não faça de novo.” O Midaz armazena essa chave temporariamente e a usa para determinar se a requisição é nova, está completa ou ainda está em andamento. Isso protege seu sistema contra duplicatas.Idempotência no Midaz
O header
X-Idempotency está disponível em todos os endpoints de criação de transação: no /v1, json, inflow, outflow, annotation, block e unblock; no /v2, direct, hold, block, unblock e batch. A reversão não recebe chave própria: o Midaz deriva uma.
As outras APIs da Lerian usam os próprios headers de idempotência, ou nenhum. Esta página foca na idempotência da API do Ledger do Midaz.
Os endpoints de transação
commit e cancel usam um lock baseado em Redis para evitar o processamento concorrente da mesma transação, mas não dão suporte a idempotência completa (sem respostas em cache nem header X-Idempotency-Replayed).X-Idempotency: a chave única que identifica a requisição.X-TTL: o time-to-live (em segundos) pelo qual o Midaz deve armazenar essa chave em cache.
Se você não enviar o header
X-Idempotency, o Midaz gera um automaticamente calculando um hash SHA-256 do corpo da requisição. O Midaz, portanto, deduplica corpos de requisição idênticos enviados para a mesma organização e ledger.- Quando uma nova chave chega, o Midaz a marca como
pending, processa a requisição e armazena a resposta completa em cache. - Se você enviar a mesma chave novamente dentro da janela de TTL:
- Enquanto a operação roda, o Midaz retorna um
409 Conflict(código de erro0084). - Se já terminou e a requisição coincide, o Midaz retorna exatamente a mesma resposta com um status
201 CreatedeX-Idempotency-Replayed: true.
- Enquanto a operação roda, o Midaz retorna um
- Se a transação falhar por erros de validação ou saldo insuficiente, o Midaz exclui a chave de idempotência. Você pode então corrigir o problema e repetir com a mesma chave.
Resumo do workflow
A Figura 1 mostra o ciclo de vida completo de uma requisição idempotente:Figura 1. Ciclo de vida de uma requisição idempotente no Midaz.
- Se a requisição não incluir uma chave de idempotência existente, o Midaz cria uma nova, ou gera uma automaticamente a partir do hash do corpo da requisição. O Midaz então processa a requisição, armazena a resposta e a retorna com
X-Idempotency-Replayed: false. - Se a chave já existir:
- Enquanto a operação roda, o Midaz retorna um
409 Conflict. - Se a operação estiver completa e a requisição coincidir, o Midaz pula a execução e retorna a resposta em cache com um status
201 CreatedeX-Idempotency-Replayed: true.
- Enquanto a operação roda, o Midaz retorna um
- Se a requisição original falhou por erros de validação ou de saldo, o Midaz exclui a chave automaticamente. Você pode repetir com segurança usando a mesma chave.
Exemplo de requisição
Veja como enviar uma requisição idempotente para criar uma transação:Geração de chave
Você pode fornecer sua própria chave
X-Idempotency ou deixar o Midaz gerar uma automaticamente.
Geração automática de chave
Se você omitir o headerX-Idempotency, o Midaz calcula um hash SHA-256 do corpo da requisição e o usa como chave de idempotência. O Midaz, portanto, deduplica o mesmo corpo JSON exato enviado para a mesma organização e ledger.
Isso é suficiente para a maioria dos cenários de repetição em que o corpo da requisição não muda entre as tentativas.
Geração de chave personalizada
Use uma chave personalizada quando você precisar:- Correlacionar a chave de idempotência com um ID no seu próprio sistema (por exemplo, um ID de pedido).
- Repetir com um corpo de requisição modificado e ainda assim deduplicar (por exemplo, depois de corrigir um campo).
- Controlar o formato da chave para fins de log ou auditoria.
Boas práticas
Sempre valide o header X-Idempotency-Replayed
Quando seu sistema recebe uma resposta de um endpoint de transação, sempre verifique o header de resposta X-Idempotency-Replayed antes de processar o resultado. Esse header diz se a resposta vem de uma nova operação ou de uma repetição em cache:
X-Idempotency-Replayed: false: esta é uma resposta nova. O Midaz acabou de processar a transação.X-Idempotency-Replayed: true: esta resposta vem do cache. O Midaz já processou a transação.
X-Idempotency-Replayed para evitar liquidar o mesmo boleto duas vezes.
Use chaves de idempotência explícitas para fluxos críticos
Embora o Midaz gere chaves automaticamente a partir do corpo da requisição, para fluxos financeiros críticos (liquidações, repasses, transferências), sempre forneça uma chaveX-Idempotency explícita vinculada ao ID do seu processo de negócio. Isso dá a você:
- Depois que a primeira requisição é concluída com sucesso, uma nova tentativa com o corpo alterado dentro da janela de TTL recebe
409(0084) em vez de uma segunda transação. - Uma trilha de auditoria clara ligando as transações do Midaz às suas operações internas.
- Proteção contra casos extremos em que a serialização da requisição pode diferir.
Defina valores de TTL apropriados
Escolha valores de TTL que correspondam à sua janela de repetição:- Para operações síncronas com repetições rápidas: 60–120 segundos.
- Para workflows assíncronos com possíveis atrasos: 300–600 segundos.
- Para processamento em lote com janelas de repetição longas: considere TTLs mais longos e chaves explícitas.
Estratégia de repetição
Use estes padrões para cenários de falha diferentes:
Falhas que permitem repetição
Estas falhas são seguras para repetir com a mesma chave de idempotência:Falhas que não permitem repetição
Estas falhas exigem uma abordagem diferente:Backoff exponencial
Para erros transitórios, use backoff exponencial com jitter para evitar sobrecarregar o servidor.Prevenindo duplicação de entidade
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. Se você tentar criar uma entidade que conflite com uma existente, o sistema bloqueia a requisição e retorna um
409 Conflict com um erro descritivo:
Ao contrário das chaves de idempotência, essas restrições são permanentes e não expiram.
Idempotência entre produtos Lerian
As outras APIs da Lerian definem os próprios headers, escopos e sinais de repetição de idempotência, e algumas não aceitam nenhum header de idempotência. Consulte a referência da API do produto que você chama antes de repetir um comando.
Perguntas frequentes
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 gera uma automaticamente calculando um hash SHA-256 do corpo da requisição. O Midaz, portanto, deduplica corpos de requisição idênticos enviados para a mesma organização e ledger. Você apenas precisa fornecer uma chave personalizada se quiser controlar a deduplicação de forma independente do corpo da requisição.
Posso reutilizar uma chave em organizações ou ledgers diferentes?
Posso reutilizar uma chave em organizações ou ledgers diferentes?
Sim. O Midaz delimita o escopo das chaves de idempotência por organização e ledger. O mesmo valor de chave usado em organizações ou ledgers diferentes não gera conflito. No entanto, dentro da mesma organização e ledger, cada chave deve ser única por operação.
Posso reutilizar uma chave em endpoints diferentes?
Posso reutilizar uma chave em endpoints diferentes?
Não. Use uma chave única para cada operação distinta.
O que acontece se eu mudar o TTL em uma repetição?
O que acontece se eu mudar o TTL em uma repetição?
O Midaz usa apenas o TTL da primeira requisição. Mudá-lo depois não tem efeito.
A resposta repetida sempre será idêntica?
A resposta repetida sempre será idêntica?
Sim. O Midaz repete a resposta completa, incluindo o status (
201 Created) e o 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).
O que acontece se a requisição original falhar?
O que acontece se a requisição original falhar?
Se a transação falhar por erros de validação ou saldo insuficiente, o Midaz exclui a chave de idempotência do cache. Você pode então corrigir o problema e repetir com a mesma chave.

