Назад к вопросам
Middle
4
Что такое transactional outbox паттерн и зачем вы его реализовывали?
Компании, где спрашивали
RedLab
Ответ от нейросети
sobes.tech AI
Transactional Outbox — это паттерн, используемый для обеспечения надежной передачи сообщений между микросервисами или компонентами системы, когда операции записи в базу данных и отправки сообщений должны быть атомарными.
Проблема в том, что запись в базу и отправка сообщения обычно происходят в разных системах, и если одна из операций не выполнится, данные могут рассинхронизироваться.
Суть паттерна:
- Вместо непосредственной отправки сообщения в рамках транзакции, сервис записывает событие (сообщение) в специальную таблицу "outbox" в той же транзакции, что и основная бизнес-операция.
- Отдельный процесс или сервис периодически читает из таблицы outbox новые сообщения и отправляет их в очередь/шину сообщений.
- После успешной отправки сообщение помечается как отправленное или удаляется.
Так достигается надежность и согласованность данных, избегая проблем с распределенными транзакциями.
Пример на Java с использованием Spring и JPA:
@Entity
public class OutboxEvent {
@Id
@GeneratedValue
private Long id;
private String aggregateType;
private String aggregateId;
private String type;
private String payload;
private boolean processed;
// геттеры и сеттеры
}
// В сервисе в рамках транзакции сохраняем бизнес-объект и создаем OutboxEvent
@Transactional
public void createOrder(Order order) {
orderRepository.save(order);
OutboxEvent event = new OutboxEvent();
event.setAggregateType("Order");
event.setAggregateId(order.getId().toString());
event.setType("OrderCreated");
event.setPayload(serialize(order));
event.setProcessed(false);
outboxRepository.save(event);
}
Отдельный процесс читает неотправленные события и публикует их в очередь.