Sobes.tech
Назад к вопросам
Senior
3

Паттерн Outbox: как обеспечить атомарность записи в БД и отправки события в очередь?

Компании, где спрашивали
Ozon ФинтехOzon Финтех

Ответ от нейросети

sobes.tech AI

Паттерн Outbox используется для обеспечения атомарности между записью данных в базу и отправкой события в очередь сообщений, чтобы избежать рассинхронизации.

Как это работает:

  1. Вместо того чтобы сразу отправлять событие в очередь, приложение записывает событие в специальную таблицу "outbox" в той же транзакции, где изменяет основную бизнес-данные.
  2. После успешного коммита транзакции отдельный процесс (например, воркер) читает события из таблицы outbox и отправляет их в очередь сообщений.
  3. После успешной отправки событие помечается как обработанное или удаляется из таблицы.

Таким образом, запись в БД и сохранение события происходят атомарно — либо оба, либо ни одного.

Пример на Java с использованием Spring и транзакций:

@Transactional
public void saveEntityAndOutboxEvent(Entity entity, OutboxEvent event) {
    entityRepository.save(entity); // сохраняем бизнес-данные
    outboxRepository.save(event); // сохраняем событие в outbox
}

Отдельный сервис периодически читает события из outbox и публикует их в очередь.

Это гарантирует, что событие не будет потеряно и не будет отправлено без соответствующих изменений в БД.