Outbox Transacional e Consistência Eventual¶
A outbox transacional resolve o problema de escrita dupla: alterar o banco e publicar mensagem sem commit atômico entre os sistemas. A alteração e o registro da outbox são escritos em uma transação local; um relay publica depois.
flowchart LR
A["Application transaction"] --> B["Business rows"]
A --> C["Outbox row"]
C --> D["Relay"]
D --> E["Message broker"]
E --> F["Idempotent consumer"]
Protocolo de entrega¶
- Valide o comando e inicie uma transação local.
- Grave estado e evento com ID estável.
- Confirme ambos ou nenhum.
- Um publicador por polling ou relay de log reivindica registros não publicados.
- Publique e então marque ou registre o progresso.
Falha após publicar e antes de marcar causa reentrega. A garantia normal é publicação pelo menos uma vez, não exatamente uma. Consumidores precisam de idempotência ou deduplicação.
Ordenação e esquema¶
Ordem global é cara e raramente necessária. Declare se a ordem é por agregado, partição ou stream e inclua versão quando consumidores precisarem detectar lacunas. Eventos são contratos duráveis: inclua tipo e versão, não exponha entidades internas e evolua consumidores de forma compatível.
Operação do relay¶
O relay precisa de lotes limitados, semântica de reivindicação, novas tentativas com deadline, tratamento de registros problemáticos, monitoramento e retenção. Várias instâncias não podem transformar disputas em perda. Idade do backlog costuma ser mais útil que apenas quantidade.
Eventos da aplicação Spring e listeners vinculados à transação não são publicação durável. Uma falha após o commit ainda perde notificação em memória.
Consistência eventual¶
Consumidores observam a mudança após atraso. O produto deve tratar a garantia de leitura das próprias escritas, eventos duplicados ou tardios, reconciliação e views divergentes temporárias. Uma saga coordena etapas; não torna transações locais globalmente atômicas.
Teste rollback, falhas antes/depois da publicação, concorrência, duplicatas, desordem, poison records, evolução, limpeza e recuperação do backlog.
Consulte os eventos vinculados à transação do Spring.