Выбор ответа Middle CDC и инкрементальная загрузка спрашивают часто обновлено

Зачем transactional outbox

Вопрос

Сервис сохраняет заказ в PostgreSQL и затем публикует событие в Kafka. Иногда заказ есть, а события нет. Какой паттерн решает проблему?

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

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

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

Коротко

Правильный ответ: Transactional outbox: событие пишется в таблицу outbox в одной транзакции с заказом, процесс публикует его. Две независимые записи не атомарны: между ними процесс может упасть.

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

  1. Публиковать событие до записи в базу, а при ошибке записи отправлять компенсирующее событие
  2. Повторять публикацию в Kafka в цикле с экспоненциальной паузой, пока брокер не подтвердит запись с acks=all
  3. Transactional outbox: событие пишется в таблицу outbox в одной транзакции с заказом, процесс публикует егоправильный ответ
  4. Распределённая транзакция между PostgreSQL и Kafka через двухфазный коммит (XA)

Разбор

Две независимые записи не атомарны: между ними процесс может упасть. Outbox превращает публикацию в часть локальной транзакции базы, а доставка из outbox гарантирует at-least-once. Публикация до записи даёт обратную проблему: событие есть, заказа нет. Бесконечный цикл не поможет, если процесс упал. Двухфазный коммит с Kafka не поддерживается и в целом сложен и хрупок.

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

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