Выбор ответа Senior Очереди и события обновлено
Проблема двойной записи
Вопрос
В чём проблема этого кода и как её решают?
await db.query('INSERT INTO orders ...');
await kafka.send({ topic: 'orders', messages: [{ key: id, value: event }] });
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: При падении между строками событие потеряется: нужен outbox. Запись в БД и отправка в брокер это две независимые системы, общей транзакции у них нет.
Варианты ответа
- Проблемы нет:
awaitгарантирует, что обе операции выполнятся - Нужно поменять строки местами: сначала отправить событие в Kafka
- Нужно обернуть обе операции в try/catch и повторить при ошибке
- При падении между строками событие потеряется: нужен outboxправильный ответ
Разбор
Запись в БД и отправка в брокер это две независимые системы, общей транзакции у них нет. Если процесс упадёт после INSERT, заказ сохранён, а событие не уйдёт. Если поменять порядок, может уйти событие о заказе, который не сохранился. try/catch не спасает от падения процесса. Transactional outbox: событие пишется в таблицу в той же транзакции, что и заказ, а отдельный процесс или CDC публикует его в брокер.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.