Вступить в клуб →
средняявопросKafka и надёжность распределённых сервисов

Запись в базу и отправка события в одном методе

Создание заказа реализовано так:

@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 и повторы у продюсера — тогда рассогласования между базой и брокером не будет

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела