Выбор ответа Senior Очереди и события обновлено

Проблема двойной записи

Вопрос

В чём проблема этого кода и как её решают?

await db.query('INSERT INTO orders ...');
await kafka.send({ topic: 'orders', messages: [{ key: id, value: event }] });

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: При падении между строками событие потеряется: нужен outbox. Запись в БД и отправка в брокер это две независимые системы, общей транзакции у них нет.

Варианты ответа

  1. Проблемы нет: await гарантирует, что обе операции выполнятся
  2. Нужно поменять строки местами: сначала отправить событие в Kafka
  3. Нужно обернуть обе операции в try/catch и повторить при ошибке
  4. При падении между строками событие потеряется: нужен outboxправильный ответ

Разбор

Запись в БД и отправка в брокер это две независимые системы, общей транзакции у них нет. Если процесс упадёт после INSERT, заказ сохранён, а событие не уйдёт. Если поменять порядок, может уйти событие о заказе, который не сохранился. try/catch не спасает от падения процесса. Transactional outbox: событие пишется в таблицу в той же транзакции, что и заказ, а отдельный процесс или CDC публикует его в брокер.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.