Sobes.tech
Back to questions
Middle — Middle+
63

Можете объяснить концепцию паттерна Transactional Outbox и его применение?

Answer from AI

sobes.tech AI

Паттерн Transactional Outbox используется для решения проблемы атомарности между записью в базу данных и отправкой сообщений (например, в очередь или событие) в распределённых системах. Основная идея — вместо прямой отправки сообщения в рамках транзакции, сохранять событие в специальной таблице (outbox) в той же транзакции, что и бизнес-данные. Затем отдельный процесс или сервис асинхронно читает эти события из таблицы и отправляет их в очередь или брокер сообщений.

Это гарантирует, что данные и события не рассинхронизируются, т.к. запись в outbox и бизнес-операция происходят атомарно.

Пример:

// В рамках транзакции сохраняем данные и событие в outbox
using var transaction = dbContext.Database.BeginTransaction();

// Сохраняем бизнес-объект
dbContext.Orders.Add(order);

// Добавляем событие в outbox
dbContext.OutboxEvents.Add(new OutboxEvent {
    EventType = "OrderCreated",
    Payload = JsonSerializer.Serialize(order),
    CreatedAt = DateTime.UtcNow
});

await dbContext.SaveChangesAsync();
transaction.Commit();

// Отдельный сервис читает из OutboxEvents и публикует в очередь