Controle de Idempotência
O controle de idempotência no gateway Fluid permite que você envie a mesma requisição múltiplas vezes de forma segura, garantindo que apenas uma execução será processada mesmo em casos de falhas de rede, timeouts ou tentativas acidentais de reenvio.
Quando usar idempotência
A idempotência é essencial em cenários onde é crítico evitar processamento duplicado:
- Pagamentos e transações financeiras
- Criação de pedidos ou registros únicos
- Integrações com sistemas externos que podem falhar
- Webhooks que podem ser reenviados
Como funciona
Headers de request
Para usar idempotência, inclua o header X-Idempotency-Key em sua requisição ao gateway:
Formato da chave de idempotência:
- Tamanho: Entre 3 e 128 caracteres
- Caracteres permitidos: Letras, números, hífen (-), underscore (_) e ponto (.)
- Recomendação: Use um identificador único e descritivo do contexto
Exemplos válidos:
- pagamento-123-20240115
- pedido_usuario456_v2
- webhook.retry.001
Chaves inválidas retornam erro 400:
Headers de response
O Gateway retorna informações sobre o status da idempotência:
Status possíveis:
- new: Primeira execução desta chave
- processing: Execução em andamento
- duplicate: Requisição duplicada (já processada)
O controle de idempotência não verifica os detalhes da requisição (como o corpo) para identificar se já foi ou não processada. Esse controle é realizado exclusivamente pelo cabeçalho X-Idempotency-Key e X-Force-Retry.
TTL Policies
A política de tempo de vida do controle de idempotência segue a tabela abaixo:
Status do fluxo | TTL | Motivo |
|---|---|---|
Sucesso | Info | 24h | Sucesso - evitar reprocessamento |
Erro | Falha | 5 min | Erro temporário - retry rápido |
Divergência | 2h | Erro cliente - evitar spam |
Comportamento por tipo de execução de fluxo
Fluxos Assíncronos (padrão)
Primeira requisição:
Requisição duplicada:
Fluxos Síncronos
Para fluxos síncronos, requisições duplicadas não retornam o resultado original:
Primeira execução:
Execução duplicada:
Execução ainda processando:
Limitação atual: Para fluxos síncronos, requisições duplicadas retornam body vazio. O resultado original não é cacheado, apenas os metadados da execução.
Forçando nova execução: Force Retry
Em casos onde você deseja reprocessar algum evento que já foi executado com uma chave de idempotência, use o header X-Force-Retry:
Códigos de status e erros
Status HTTP
Todas as requisições com idempotência retornam 200 OK quando bem-sucedidas, independentemente de ser uma execução nova ou duplicada. A diferenciação é feita através dos headers.
Erros comuns
Chave de idempotência inválida (400 Bad Request):
Chave muito pequena ou muito grande:
Outros erros não relacionados à idempotência:
Combinando com outros parâmetros
A idempotência funciona normalmente com todos os outros recursos do Gateway:
# Fluxo síncrono com idempotência e tags
curl --location '{gateway_host}/v2/flows/processar-pedido?sync=true&return_step=resposta&tags=ecommerce,urgente&key={api_key}' \
--header 'Content-Type: application/json' \
--header 'X-Idempotency-Key: pedido-789-retry-001' \
--data '{
"produtos": [{"id": 1, "quantidade": 2}],
"cliente_id": "user_456"
}'Boas práticas
Gerando chaves de idempotência
✅ Boas práticas:
❌ Evite:
Tratamento de erros
Integração com webhooks
Ao receber webhooks que podem ser reenviados, use uma chave baseada no ID único do evento:
Limitações atuais
Resultados síncronos: Por ora, o sistema não cacheia o resultado de execuções síncronas. Requisições duplicadas retornam apenas metadados (event_id, status) sem o corpo da resposta original.
Escopo por tenant: Chaves de idempotência são isoladas por tenant (API Key). A mesma chave pode ser usada por diferentes tenants sem conflito.
Monitoramento
Use os headers de resposta para monitorar o comportamento da idempotência: