Senior
51
Outbox-Muster: Wie stellt man die Atomarität beim Schreiben in die Datenbank und beim Senden des Ereignisses an die Warteschlange sicher?
Unternehmen wurden gefragt
Antwort von AI
sobes.tech KI
Паттерн Outbox используется для обеспечения атомарности между записью данных в базу и отправкой события в очередь сообщений, чтобы избежать рассинхронизации.
Как это работает:
- Вместо того чтобы сразу отправлять событие в очередь, приложение записывает событие в специальную таблицу "outbox" в той же транзакции, где изменяет основную бизнес-данные.
- После успешного коммита транзакции отдельный процесс (например, воркер) читает события из таблицы outbox и отправляет их в очередь сообщений.
- После успешной отправки событие помечается как обработанное или удаляется из таблицы.
Таким образом, запись в БД и сохранение события происходят атомарно — либо оба, либо ни одного.
Пример на Java с использованием Spring и транзакций:
@Transactional
public void saveEntityAndOutboxEvent(Entity entity, OutboxEvent event) {
entityRepository.save(entity); // сохраняем бизнес-данные
outboxRepository.save(event); // сохраняем событие в outbox
}
Отдельный сервис периодически читает события из outbox и публикует их в очередь.
Это гарантирует, что событие не будет потеряно и не будет отправлено без соответствующих изменений в БД.