Sobes.tech
Назад к вопросам
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);
}

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