Pular para conteúdo

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

  1. Valide o comando e inicie uma transação local.
  2. Grave estado e evento com ID estável.
  3. Confirme ambos ou nenhum.
  4. Um publicador por polling ou relay de log reivindica registros não publicados.
  5. 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.