Middle — Middle+
Pode explicar o conceito do padrão Transactional Outbox e sua aplicação?
sobes.tech IA
Resposta da IA
O padrão Transactional Outbox é utilizado para resolver o problema de atomicidade entre a gravação na base de dados e o envio de mensagens (por exemplo, para uma fila ou evento) em sistemas distribuídos. A ideia principal é, em vez de enviar diretamente uma mensagem dentro de uma transação, guardar o evento numa tabela especial (outbox) na mesma transação que os dados de negócio. Depois, um processo ou serviço separado lê esses eventos de forma assíncrona da tabela e os envia para uma fila ou broker de mensagens.
Isto garante que os dados e eventos não fiquem desincronizados, pois a gravação na outbox e a operação de negócio ocorrem de forma atômica.
Exemplo:
// Dentro de uma transação, guardamos os dados e o evento na outbox
using var transaction = dbContext.Database.BeginTransaction();
// Guardamos o objeto de negócio
dbContext.Orders.Add(order);
// Adicionamos o evento à outbox
dbContext.OutboxEvents.Add(new OutboxEvent {
EventType = "OrderCreated",
Payload = JsonSerializer.Serialize(order),
CreatedAt = DateTime.UtcNow
});
await dbContext.SaveChangesAsync();
transaction.Commit();
// Um serviço separado lê de OutboxEvents e publica na fila