Início › Glossário › Outbox Pattern
Glossário

O que é Outbox Pattern?

Outbox Pattern é um jeito de publicar eventos com confiabilidade: o sistema grava a mudança no banco e, na mesma transação, registra um “evento” numa tabela outbox. Depois, um processo separado envia esse evento para fila, webhook ou iPaaS. Ele reduz casos de pedido criado “sem disparar automação”, duplicidade e inconsistência em integrações.

O problema real: “salvou no banco, mas a automação não aconteceu”

Em automação, o pior bug nem sempre é o erro visível — é o silêncio. Você cria um pedido, aprova um pagamento, atualiza um status… e a etapa seguinte (notificação, emissão, CRM) simplesmente não roda.

Isso costuma acontecer quando você tenta fazer duas coisas “de uma vez”: (1) salvar no banco e (2) publicar um evento (fila, webhook, tópico) dentro do mesmo fluxo de request. Se a publicação falhar depois do commit, você fica com dado persistido e evento ausente. Se publicar antes e o commit falhar, você pode gerar evento de algo que não existe.

O que é Outbox Pattern (sem misticismo)

Outbox é uma tabela/coleção no seu banco (ex.: outbox_events) onde seu sistema registra, junto com a alteração principal, um evento a ser enviado. A sacada é transacional: se o pedido foi salvo, o evento também foi salvo — ou nenhum dos dois.

Depois, um “dispatcher” (worker, cron, serviço) lê a outbox e entrega os eventos para o destino: RabbitMQ/Kafka/SQS, webhook, ou até um endpoint que dispara um workflow no n8n/Make.

  • Transação única: grava dado + evento outbox no mesmo commit
  • Entrega assíncrona: um processo separado publica/entrega
  • Reprocessamento: se falhar, o evento fica na outbox e tenta de novo
  • Rastreabilidade: dá para auditar o que deveria ter sido enviado

Como o fluxo funciona (passo a passo)

O desenho clássico tem três partes: aplicação, outbox no banco e dispatcher. O dispatcher pode rodar a cada poucos segundos/minutos ou ficar escutando mudanças (depende da stack).

EtapaO que aconteceO que você ganha
1) App recebe a açãoEx.: criar pedido / atualizar statusUm ponto único de decisão
2) Transação no bancoINSERT/UPDATE do dado + INSERT do evento na outboxConsistência entre dado e evento
3) Dispatcher lê outboxBusca eventos pendentes (por status/lock)Separação de responsabilidade
4) Publica no destinoEnvia para fila/webhook/iPaaSIntegrações mais resilientes
5) Marca como enviadoAtualiza status/processed_at e guarda erro se falharReprocesso e auditoria

Quando vale usar (sinais práticos)

Outbox não é “padrão obrigatório”. Ele vale quando o custo de perder um evento é maior que o custo de manter um dispatcher e uma tabela a mais.

  • Você já viu casos de: “pedido existe, mas não foi faturado/notificado”
  • Existe mais de um consumidor do mesmo evento (ex.: CRM + estoque + BI)
  • Seu workflow precisa ser reprocessável (e você quer trilha de auditoria)
  • Integrações são externas e instáveis (APIs que oscilam, rate limit, timeout)
  • Você precisa de escalabilidade: publicar eventos fora do request reduz latência percebida

Outbox não resolve tudo: duplicidade e ordem ainda importam

Um detalhe que pega muita gente: Outbox melhora consistência, mas não garante que o destino não receba duplicado. Retentativas podem reenviar o mesmo evento. Então, do lado do consumidor, idempotência deixa de ser “capricho” e vira pré-requisito.

Outro ponto: dependendo de como você lê a outbox e publica, eventos podem chegar fora de ordem quando há paralelismo. Se ordem for crítica (ex.: status), você precisa de chave de ordenação (por entidade) e regras claras para aceitar/descartar eventos.

Armadilhas comuns (e como não cair)

Alguns erros aparecem sempre, especialmente em automações com ferramentas no-code e um pedaço de back-end próprio.

  • Sem índice e sem limpeza: a outbox cresce e vira gargalo; defina retenção e índices por status/data
  • Marcar como “enviado” cedo demais: só marque depois de confirmação real (ack/resposta 2xx/publish confirmado)
  • Dispatcher sem lock: dois workers publicam o mesmo evento; use lock otimista/pessimista ou claim por batch
  • Payload gigante: guarde referência (ID) e versão do evento; evite duplicar documentos enormes na outbox
  • Misturar regra de negócio no dispatcher: ele deve ser chato e previsível (ler, publicar, marcar, logar)

Outbox vs alternativas (visão rápida)

Dependendo da arquitetura, existem outras opções: CDC (captura de mudança no banco), publish direto em fila com transações distribuídas (geralmente caro e complexo), ou aceitar inconsistência e reconciliar depois (quando dá). Outbox costuma ser o meio-termo pragmático.

Se você trabalha com automação em n8n/Make, o padrão aparece quando existe um sistema “fonte” (ERP, e-commerce, back-end) que precisa alimentar workflows sem perder eventos — especialmente em picos.

AbordagemPrósContras
Publicar evento direto no requestSimples de implementarRisco de evento perdido/duplicado em falhas; aumenta latência
Outbox PatternBoa consistência; reprocesso; auditoriaPrecisa dispatcher, governança e idempotência no consumo
CDC (Change Data Capture)Pouca mudança no app; captura direto do bancoOperação mais complexa; nem sempre é trivial no Brasil (stack/infra)

Perguntas frequentes

Outbox Pattern é o mesmo que fila (RabbitMQ/Kafka/SQS)?
Não. Outbox é onde você registra o “evento a enviar” com consistência transacional (geralmente no seu banco). A fila é o destino (ou um dos destinos) onde o evento será publicado para consumo assíncrono.
Dá para usar Outbox com n8n ou Make?
Dá, desde que exista um componente que leia a outbox e dispare o workflow (via webhook, fila ou API). Em geral, o n8n/Make não “substitui” a outbox; ele entra depois, como consumidor do evento publicado.
Outbox elimina mensagens duplicadas?
Não elimina; ele reduz perda e melhora reprocesso. Duplicidade ainda pode acontecer por retentativa, falha de confirmação ou concorrência. Por isso, o consumidor (workflow/serviço) deve ser idempotente, usando chave de idempotência e deduplicação.
Qual o mínimo que preciso para começar com Outbox sem overengineering?
Uma tabela outbox com (id, tipo, payload/refs, status, tentativas, timestamps), um job que pega pendentes em batch, publica com retry/backoff e marca como enviado. O resto (paralelismo, particionamento, DLQ) você adiciona quando o volume e o risco exigirem.

Termos relacionados

← Ver glossário completo