O que é o Outbox Pattern?
O Outbox Pattern é um padrão arquitetural que garante a consistência entre operações de banco de dados e a publicação de eventos em sistemas distribuídos. O nome "Outbox" não é à toa: a ideia central desse padrão é registrar eventos de domínio em uma tabela especial (a outbox), deixando para um componente externo — chamado de Outbox Publisher — a responsabilidade de processar e publicar esses eventos para outros sistemas.
Por que o Outbox Pattern é necessário?
Imagine um cenário em que temos uma ordem de pedido, que pode ser confirmada ou cancelada. Quando um pedido é confirmado ou cancelado, normalmente precisamos não só atualizar o banco de dados, mas também avisar outros sistemas — por exemplo, para atualizar o estoque, enviar e-mails ou notificar o financeiro. Surge então um problema clássico: como garantir que, se o banco de dados foi atualizado, o evento também será publicado? E se a publicação do evento falhar depois que o pedido já foi confirmado no banco?
Como o Outbox Pattern funciona na prática?
É aí que entra o Outbox Pattern. Em vez de tentar atualizar o banco e publicar o evento ao mesmo tempo (correndo o risco de uma das operações falhar), fazemos tudo em uma única transação: salvamos o pedido e registramos o evento na tabela de outbox. Essa tabela funciona como uma fila local de eventos que precisam ser processados. Nada é enviado para fora ainda.
Exemplo prático de uso
Por exemplo, ao confirmar um pedido, você faz algo assim:
- Atualiza o status do pedido para "CONFIRMADO" no banco de dados.
- Cria um registro na tabela de outbox, dizendo: "Pedido X foi confirmado".
Tudo isso acontece dentro da mesma transação. Se der erro, nada é salvo. Se der certo, tanto o pedido quanto o evento ficam registrados de forma atômica.
Exemplo de registro na tabela de outbox
Para ilustrar, imagine que o registro na tabela de outbox poderia ter o seguinte formato JSON:
{
"id": "a1b2c3d4-e5f6-7890-1234-567890abcdef",
"aggregate_id": "pedido-123",
"aggregate_type": "pedido",
"type": "PedidoConfirmado",
"payload": {
"pedido_id": "pedido-123",
"cliente_id": "cliente-456",
"data_confirmacao": "2024-06-10T10:00:00Z"
},
"status": "pending",
"created_at": "2024-06-10T09:59:59Z"
}
Nesse exemplo, o payload
contém os dados específicos do evento, como o ID do pedido, o ID do cliente e a data de confirmação.
O papel do Outbox Publisher
Depois, entra em cena o Outbox Publisher. Ele é um processo separado, que fica monitorando a tabela de outbox. Periodicamente, ele busca os eventos pendentes, publica cada um deles para um message broker (como Kafka, RabbitMQ, SQS, etc.) e, só então, marca o evento como processado. Se a publicação falhar, o evento permanece na tabela e será tentado novamente depois, garantindo que nada se perca.
Exemplo de evento processado
Após a publicação bem-sucedida, o status do evento na tabela de outbox é atualizado:
{
"id": "a1b2c3d4-e5f6-7890-1234-567890abcdef",
"aggregate_id": "pedido-123",
"aggregate_type": "pedido",
"type": "PedidoConfirmado",
"payload": {
"pedido_id": "pedido-123",
"cliente_id": "cliente-456",
"data_confirmacao": "2024-06-10T10:00:00Z"
},
"status": "processed",
"created_at": "2024-06-10T09:59:59Z",
"processed_at": "2024-06-10T10:00:01Z"
}
O campo status
agora é "processed", e o campo processed_at
indica quando o evento foi publicado.
Se a publicação falhar, o evento pode ser retentado um número limitado de vezes antes de ser movido para uma "dead letter queue" para análise posterior.
Vantagens do Outbox Pattern
- Consistência garantida: O pedido só é confirmado se o evento também for registrado, evitando inconsistências entre o banco de dados e os sistemas externos.
- Resiliência: Se o broker estiver fora do ar, os eventos ficam guardados na tabela de outbox e serão enviados assim que possível, sem perda de informação.
- Desacoplamento: O serviço de pedidos não precisa saber quem vai consumir o evento. Ele só registra o que aconteceu, e o Outbox Publisher cuida do resto.
- Escalabilidade e observabilidade: É possível monitorar, reprocessar ou até mesmo auditar eventos que ficaram pendentes ou falharam, facilitando a manutenção e a evolução do sistema.
Conclusão
No fim das contas, o Outbox Pattern é uma forma elegante e robusta de garantir que nada se perde no caminho entre o banco de dados e o mundo externo, mesmo em cenários de falha. Ele é amplamente utilizado em sistemas modernos, principalmente quando você precisa de confiabilidade, rastreabilidade e consistência em ambientes distribuídos.
Top comments (0)
Some comments may only be visible to logged-in visitors. Sign in to view all comments.