Вступить в клуб →
средняявопросКэш, очереди и микросервисы

Заказ сохранён, событие не отправлено: разъехавшиеся состояния

В обработчике создания заказа написано:

await db.SaveChangesAsync();                        // заказ сохранён в PostgreSQL
await _bus.PublishAsync(new OrderCreated(order.Id)); // событие ушло в RabbitMQ

Во время инцидента брокер был недоступен несколько минут: заказы в базе появились, а события о них не ушли — смежные сервисы о новых заказах так и не узнали. Какое решение устраняет проблему по сути?

  • Поменять строки местами: сначала публиковать событие, затем сохранять заказ
  • Обернуть обе операции в TransactionScope: брокер поддержит распределённую транзакцию вместе с базой и откатит обе при сбое
  • Добавить вокруг Publish повтор с тремя попытками — этого достаточно, чтобы событие не потерялось
  • Записывать событие в таблицу outbox в той же транзакции, что и заказ, а публиковать записи отдельным воркером

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

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

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

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