O que a Routa garante
Nenhuma perda silenciosa
Uma mensagem aceita (
202) é gravada de forma durável antes da resposta. Ela nunca desaparece sem deixar rastro: chega ao destino ou vira failed.Status que não regride
O status só avança. Uma mensagem não volta de
read para sent por causa de um aviso atrasado.Falhas permanentes são visíveis
Toda falha terminal gera
message.failed, e as transitórias são retentadas automaticamente.Eventos recuperáveis
Eventos ficam no log por 90 dias e podem ser consultados e reenviados.
O que a Routa não garante
- Entrega imediata. Aceitar não é entregar. A latência depende do provedor e da fila do canal.
- Ordem global. Mensagens e eventos podem chegar fora de ordem. Use
sequence,occurred_ate o status monotônico para reconciliar. - Exatamente uma vez. Não existe entrega exatamente uma vez contra uma API HTTP de terceiros. A garantia é pelo menos uma vez.
Envio: aceito, depois assíncrono
- A API valida e grava a mensagem e o evento
message.acceptedna mesma transação. Só então responde202. - Um worker envia ao provedor, respeitando os limites de taxa do canal.
- As confirmações do provedor (
sent,delivered,read,failed) atualizam a mensagem e geram eventos.
Se algo falha no meio
Resultado desconhecido
O caso mais difícil é um timeout contra o provedor: a mensagem pode ou não ter sido enviada. A Routa:- Envia uma referência determinística junto com a mensagem, permitindo deduplicação no provedor.
- Antes de tentar de novo, consulta o provedor para saber se ele já registrou a mensagem, quando ele oferece essa consulta.
- Se a dúvida persiste, tenta de novo: a garantia é pelo menos uma vez. A duplicidade é rara e honesta, nunca escondida.
Recebimento
Mensagens recebidas são persistidas antes de serem processadas, e a Routa deduplica reentregas do provedor. Conteúdo que ela não entende viracontent.type = "unsupported": a mensagem não é descartada. Se uma mídia recebida falha em definitivo, a mensagem continua existindo com a mídia unavailable.
Eventos e webhooks
- Cada evento é entregue pelo menos uma vez a cada endpoint assinante, com o mesmo
idem todas as tentativas. - Uma entrega é retentada por cerca de 20 horas. Depois disso ela fica
exhaustede pode ser reenviada. Veja Retentativas e reenvio. GET /v1/eventspermite reconciliar. Veja Reconciliar eventos.
Como projetar sua integração
1
Envie com idempotência
Use
Idempotency-Key em todo envio. Veja Idempotência.2
Não trate 202 como entrega
Confirme a entrega por
message.delivered.3
Processe eventos de forma idempotente
Deduplique por
event.id e nunca regrida o status.4
Tenha um job de conferência
Rode periodicamente
GET /v1/events como rede de segurança.