Запись в базу и отправка события в одном методе
Создание заказа реализовано так:
@Transactional
public void createOrder(OrderRequest request) {
Order order = orderRepository.save(new Order(request));
kafkaTemplate.send("orders", toEvent(order));
auditService.write(order); // может бросить исключение
}
Какой риск здесь заложен и как его снимают?
- База и брокер не в общей транзакции: событие может уйти при откате или потеряться при сбое отправки — лечится паттерном Transactional Outbox
- Риска нет: отправка в Kafka выполняется в той же транзакции и откатится вместе с записью в базу
- Достаточно перенести отправку в Kafka в начало метода, до сохранения заказа: тогда порядок операций станет безопасным
- Достаточно выставить acks=all и повторы у продюсера — тогда рассогласования между базой и брокером не будет
