Sobes.tech
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