Назад к вопросам
Ozon Финтех
Senior
3
Паттерн Outbox: как обеспечить атомарность записи в БД и отправки события в очередь?
Компании, где спрашивали
Ответ от нейросети
sobes.tech AI
Паттерн Outbox используется для обеспечения атомарности между записью данных в базу и отправкой события в очередь сообщений, чтобы избежать рассинхронизации.
Как это работает:
- Вместо того чтобы сразу отправлять событие в очередь, приложение записывает событие в специальную таблицу "outbox" в той же транзакции, где изменяет основную бизнес-данные.
- После успешного коммита транзакции отдельный процесс (например, воркер) читает события из таблицы outbox и отправляет их в очередь сообщений.
- После успешной отправки событие помечается как обработанное или удаляется из таблицы.
Таким образом, запись в БД и сохранение события происходят атомарно — либо оба, либо ни одного.
Пример на Java с использованием Spring и транзакций:
@Transactional
public void saveEntityAndOutboxEvent(Entity entity, OutboxEvent event) {
entityRepository.save(entity); // сохраняем бизнес-данные
outboxRepository.save(event); // сохраняем событие в outbox
}
Отдельный сервис периодически читает события из outbox и публикует их в очередь.
Это гарантирует, что событие не будет потеряно и не будет отправлено без соответствующих изменений в БД.