Sobes.tech
Senior
47

Modèle Outbox : comment assurer l'atomicité de l'écriture dans la base de données et l'envoi de l'événement à la file d'attente ?

Entreprises à qui on a demandé
Ozon ФинтехOzon Финтех

Réponse de l'IA

sobes.tech IA

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

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

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

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

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

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

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

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