Заказ сохранён, событие не отправлено: разъехавшиеся состояния
В обработчике создания заказа написано:
await db.SaveChangesAsync(); // заказ сохранён в PostgreSQL
await _bus.PublishAsync(new OrderCreated(order.Id)); // событие ушло в RabbitMQ
Во время инцидента брокер был недоступен несколько минут: заказы в базе появились, а события о них не ушли — смежные сервисы о новых заказах так и не узнали. Какое решение устраняет проблему по сути?
- Поменять строки местами: сначала публиковать событие, затем сохранять заказ
- Обернуть обе операции в TransactionScope: брокер поддержит распределённую транзакцию вместе с базой и откатит обе при сбое
- Добавить вокруг Publish повтор с тремя попытками — этого достаточно, чтобы событие не потерялось
- Записывать событие в таблицу outbox в той же транзакции, что и заказ, а публиковать записи отдельным воркером
